Tech

[C#]Genericsの使い方をまとめてみた。その1

投稿日:2019年8月8日 更新日:

はじめに

こんにちはsuzukiです。今回はGenericsの基本編です。例を交えて基本的な考え方をまとめました。
私は使う機会はそれなりにあるのですが、追加開発では初めから実装しないので書き方を忘れがちです。
今後の備忘として参考にできたらと思っています。
記事として少し長くなるため、2~3回でまとめさせていただく予定です。

Genericsとは

型をパラメーターとして受け取ることにより、その型に対応したクラスやメソッドを生成する機能です。
Genericsを使うことで型だけが異なり処理内容が同じクラスやメソッドを簡潔に書くことができます。

Genericsの例

今回は例としてSwapという処理をもとに考えていきます。

Genericsを使わない場合

例えば2つの整数の参照を入れ替えるという関数を記述すると下記のようになります。

SwapIntを利用し整数の参照を入れ替えるコードを記述すると下記になります

ログ出力結果

整数だけを扱う関数であれば問題ないのですが、同じ処理を文字列や小数でも行いたい場合にそれぞれの関数を作成するのは大変です。またコード量が増えるので当然保守性が下がってしまいます。

Genericsを使う場合

SwapIntはintの型のみしか使えない関数でしたが、Genericsを使うと型をパラメーターとして受け取ることができます。
使い方は関数名の後ろに<>を追加し受け取る型パラメーター名を設定します。Genericsを使う時によくと書かれていますが、Typeのイニシャルだかららしいです。特にでないといけない理由はありません。
また受け取ったTと同じ型で、a,bの参照とtempの型が設定されています。

Swapを利用するには関数名<型>(引数)のように呼び出しが可能です。
また、今回のように型パラメーターと引数の型が同じ場合<型>を簡略化することが可能です。

ログ出力結果

Genericを使うことにより、”同じ任意のクラスのaとbの参照先を入れ替える”という抽象的な関数にすることができました。SwapIntに比べ様々なクラスを引数に設定できるようになり便利になりました。

Genericsのメリット

またGenericsを使うメリットが大きい例として、コレクションクラスと呼ばれる配列のような複数の値をひとまとめにするクラスの処理を考えていきましょう。
例)配列で行いたい処理

  • 中身がintだったら各要素の総和のintが返却される関数
  • 中身がfloatだったら各要素の総和のfloatが返却される関数
  • 中身がstringだったら各要素をつなげたstringが返却される関数

独自に行う場合foreachでそれぞれの要素(int,float,string)を+するという処理で実装可能です。しかしそれぞれ関数として定義するとコード量が多くなります。
またコレクションクラスとしても配列以外にも可変長配列などもあります。さらに総和以外の処理を追加することも考えられます。

上記をそれぞれ関数化するのではなく、Genericsを使い任意の型を格納し任意の種類のコレクションを扱えるコレクション操作関数を作成すれば、それぞれの関数を定義する必要がなくなるため、依存性も相関性も低い状態を作ることができます。
つまり雪だるま式に増えていくコードを書かなくても良くなります!

さいごに

今回は関数のGenericsを利用して説明させていただきました。他にもクラスを使う場合や制約条件の使い方等を次回にまとめさせていただきます。漫然と誰かが作ったGenericsを使うだけでなく、自分も途中からでも活用すべき内容はないか検討していきたいです。それではまた次回もよろしくお願いいたします。

おすすめ書籍

Unityの教科書 Unity2019完全対応版 2D&3Dスマートフォンゲーム入門講座 作って学べる Unity 超入門 スラスラ読める Unity C#ふりがなプログラミング

blog-page_footer_336




blog-page_footer_336




-Tech
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

ReactNativeでアニメーションの実装

1 はじめに2 準備3 実装3.1 イベントを通しての実行3.2 アニメーションについて4 lottie-react-native4.1 Lottieとは5 準備6 実装7 さいごに8 おすすめ書籍 ...

[Unity] Terrain(地形)を使ってみた

1 はじめに2 Terrainの追加方法3 Terrainの使い方4 Create Neighbor Terrain5 Paint Terrain5.1 Raise or Lower Terrain5 ...

入門スクラム〜スクラムフレームワーク

1 はじめに2 スクラムの特徴2.1 シンプルなフレームワークであること2.2 素早い反復を繰り返すこと2.3 検査・適応・透明性3 スクラムの役割3.1 プロダクトオーナー3.2 スクラムマスター3 ...

Flutterで写真撮影しよう!

1 はじめに2 準備3 実装3.1 プレビューの表示3.2 写真を撮る4 さいごに5 おすすめ書籍 はじめに 今回はFlutterでカメラを使用して、プレビューの表示と写真の撮影を行いたいと思います。 ...

【Flutter】背景ぼかしなど簡単な画像操作をImageFilteredで行う

1 はじめに2 準備3 実装3.1 ぼかし(ブラー)3.2 マトリックス3.3 BackdropFilterとの違い4 さいごに5 おすすめ書籍 はじめに 背景のぼかしや、画像のローテートなど、簡単に ...

フォロー

blog-page_side_responsive

2019年8月
 123
45678910
11121314151617
18192021222324
25262728293031

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。