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#ふりがなプログラミング

page_footer_300rect




page_footer_300rect




-Tech
-

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

ReactNative入門

1 はじめに2 そもそもReact Nativeとは3 JSXとは3.1 JSXに値を埋め込む3.2 属性の値を設定する3.3 関数でJSXを作る4 コンポーネントとは4.1 再利用性4.2 新規コン ...

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

1 はじめに2 Genericsの構文3 型パラメーター4 制約条件5 規定値6 さいごに7 おすすめ書籍 はじめに こんにちはsuzukiです。ブログを書いているときAndroid10が発表され、ア ...

React初心者のRedux解説

1 はじめに2 Reduxとは2.1 そもそもReduxってなに?2.2 Fluxとは2.3 Reduxの3原則2.3.0.1 Single source of truth2.3.0.2 State ...

ReactNativeデータ永続化

1 はじめに2 データ永続化の方法3 AsyncStorage4 react-native-async-storage4.1 インストール4.2 実装5 Realm5.1 インストール5.2 redu ...

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

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

フォロー

follow us in feedly

page_side_300rect

2019年8月
« 7月 9月 »
 123
45678910
11121314151617
18192021222324
25262728293031

アプリ情報

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