[C#]Genericsの使い方とは?GenericsメソッドやGenericsクラスの作成方法
![[C#]Genericsの使い方とは?GenericsメソッドやGenericsクラスの作成方法](https://www.fenet.jp/dotnet/column/wp-content/uploads/2020/04/0092.jpg)
エンジニア
マネージャー
[C#]Genericsの使い方とは?
今回は、C#でのGenericsの使い方について説明します。Genericsとは、様々な型に自動的に対応するための、クラスやメソッドを生成する機能です。ここでは、Genericsを使わない場合の実装方法、GenericsメソッドやGenericsクラスの作成方法について紹介します。
Genericsの使い方に興味のある方はぜひご覧ください。
Genericsを使わない場合
C#でGenericsを説明する前に、Genericsを使わない場合の実装方法について紹介します。ここでは、2つの変数を入れ替えるメソッドを実装します。実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
using System; namespace ConsoleApp1 { class Program { // int用のswapメソッド static void IntSwap(ref int value1, ref int value2) { int temp = default(int); temp = value2; value2 = value1; value1 = temp; } // string用のswapメソッド static void StrSwap(ref string value1, ref string value2) { string temp = ""; temp = value2; value2 = value1; value1 = temp; } public static void Main(string[] args) { int ival1 = 1, ival2 = 2; string sval1 = "str1", sval2 = "str2"; // int変数のswap Console.WriteLine("ival1:{0}, ival2:{1}", ival1, ival2); // ival1:1, ival2:2 IntSwap(ref ival1, ref ival2); Console.WriteLine("ival1:{0}, ival2:{1}", ival1, ival2); // ival1:2, ival2:1 // string変数のswap Console.WriteLine("sval1:{0}, ival2:{1}", sval1, sval2); // sval1:str1, ival2:str2 StrSwap(ref sval1, ref sval2); Console.WriteLine("sval1:{0}, ival2:{1}", sval1, sval2); // sval1:str2, ival2:str1 } } } |
実行結果は以下のようになります。変数が入れ替えられていることが分かります。
1 2 3 4 |
ival1:1, ival2:2 ival1:2, ival2:1 sval1:str1, ival2:str2 sval1:str2, ival2:str1 |
IntSwapメソッドとStrSwapメソッドは引数の型が違うだけです。ロジックは同じなので、Genericsを利用すれば、型に応じたメソッドを作成できます。以降の章でGenericsの使い方を紹介します。
Genericsメソッド
C#でのGenericsメソッドの作り方を紹介します。先ほどのSwapメソッドをGenericsメソッドにします。Genericsメソッドには<T>を付与します。実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System; namespace ConsoleApp1 { class Program { // Genericsメソッド static void Swap<T>(ref T value1, ref T value2) { T temp = default(T); temp = value2; value2 = value1; value1 = temp; } public static void Main(string[] args) { int ival1 = 1, ival2 = 2; string sval1 = "str1", sval2 = "str2"; // intのswap Console.WriteLine("ival1:{0}, ival2:{1}", ival1, ival2); // ival1:1, ival2:2 Swap<int>(ref ival1, ref ival2); Console.WriteLine("ival1:{0}, ival2:{1}", ival1, ival2); // ival1:2, ival2:1 // stringのswap Console.WriteLine("sval1:{0}, ival2:{1}", sval1, sval2); // sval1:str1, ival2:str2 Swap<string>(ref sval1, ref sval2); Console.WriteLine("sval1:{0}, ival2:{1}", sval1, sval2); // sval1:str2, ival2:str1 } } } |
実行結果は以下のようになります。変数が入れ替えられていることが分かります。
1 2 3 4 |
ival1:1, ival2:2 ival1:2, ival2:1 sval1:str1, ival2:str2 sval1:str2, ival2:str1 |
このようにC#では、Genericsを利用することで型に応じたメソッドを作成できます。
Genericsクラス
C#でのGenericsクラスの作り方を紹介します。実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System; namespace ConsoleApp1 { // Genericsクラス public class HogeClass<T> { public void HogeMethod<T>(T input) { Console.WriteLine("input value is {0}", input); } } class Program { public static void Main(string[] args) { HogeClass<int> hoge = new HogeClass<int>(); hoge.HogeMethod<int>(1); // input value is 1 HogeClass<string> hoge2 = new HogeClass<string>(); hoge2.HogeMethod<string>("Hello world"); // input value is Hello world } } } |
実行結果は以下のようになります。引数の型に応じてクラスが生成され、クラスメソッドが呼び出されていることが分かります。
1 2 |
input value is 1 input value is Hello world |
このようにC#では、Genericsを利用することで型に応じたクラスを作成できます。
Genericsクラスのコンストラクタ
C#のGenericsメソッドでは、型引数が明確な場合は省略できます。先ほどの例だと、以下のように記述できます。
1 2 3 4 5 |
HogeClass<int> hoge = new HogeClass<int>(); hoge.HogeMethod(1); // input value is 1 HogeClass<string> hoge2 = new HogeClass<string>(); hoge2.HogeMethod("Hello world"); // input value is Hello world |
一方、コンストラクタは型引数を省略できません。コンストラクタ付きのGenericsクラスのサンプルを以下に記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System; namespace ConsoleApp1 { // Genericsクラス public class HogeClass<T> { public T Value { get; } // コンストラクタ public HogeClass(T t) { this.Value = t; } public void ShowValue() { Console.WriteLine("input value is {0}", Value); } } class Program { public static void Main(string[] args) { HogeClass<int> hoge = new HogeClass<int>(1); hoge.ShowValue(); // input value is 1 HogeClass<string> hoge2 = new HogeClass<string>("Hello world"); hoge2.ShowValue(); // input value is Hello world } } } |
実行結果は以下のようになります。
1 2 |
input value is 1 input value is Hello world |
このようにC#では、コンストラクタ付きのGenericsクラスの場合は型引数を省略できません。
エンジニア
マネージャー
まとめ
いかがでしたでしょうか。C#でのGenericsの使い方について説明しました。ここでは、Genericsを使わない場合の実装方法、GenericsメソッドやGenericsクラスの作成方法について紹介しました。
ぜひご自身でC#のソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅)システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)