概要:
C# のジェネリックは、クラス、メソッド、デリゲートを作成するときにパラメーター化された型の使用を可能にするメカニズムです。ジェネリックを使用すると、型変換や同様のコードの書き換えを回避して、より一般的で再利用可能なコードを作成できます。
ジェネリックの基本的な構文は次のとおりです。
class ClassName<T>
{
// 泛型类的定义
}
void MethodName<T>(T parameter)
{
// 泛型方法的定义
}
ジェネリック クラスまたはメソッドでは、T はクラスのフィールド、メソッドのパラメーター、および戻り値の型を定義するために使用できる型パラメーターです。
ジェネリックを使用する一般的な例をいくつか示します。
汎用クラス:
class GenericClass<T>
{
private T value;
public GenericClass(T value)
{
this.value = value;
}
public T GetValue()
{
return value;
}
}
GenericClass<int> intObject = new GenericClass<int>(5);
int intValue = intObject.GetValue();
GenericClass<string> stringObject = new GenericClass<string>("Hello");
string stringValue = stringObject.GetValue();
一般的な方法:
T Max<T>(T a, T b)
{
return a.CompareTo(b) > 0 ? a : b;
}
int maxInt = Max<int>(5, 3);
string maxString = Max<string>("apple", "banana");
一般的な渡し方:
//サブクラスも特定の型を認識していないため、後で汎用的な特殊化が必要な場所に型を渡します。
public class person<T>
{
public T Name {
get; set; }
}
//泛型方法中也可以定义多个泛型
public class teacher<T, U> : person<T>
{
public U date {
get; set; }
public override string? ToString()
{
string str = "";
str += $"name:{
Name}\n";
str += $"date:{
date}";
return str.ToString();
}
}
private static void Main(string[] args)
{
teacher<string, int> t1 = new teacher<string, int>();
t1.Name = "xiaoming";
t1.date = 2023;
Console.WriteLine(t1.ToString());
}
ジェネリック制約 (Constraints) を使用すると、ジェネリック型パラメーターを制限し、型パラメーターが満たさなければならない条件を指定できます。たとえば、where キーワードを使用すると、型パラメータを特定の基本クラス、インターフェイス、またはパラメータなしのコンストラクタに制限できます。
一般的な制約の例:
class GenericClass<T> where T : IComparable
{
// T必须实现IComparable接口
}
T Max<T>(T a, T b) where T : IComparable
{
// T必须实现IComparable接口
}
class MyClass<T> where T : new()
{
// T必须具有无参数构造函数
}
クラスとメソッドに加えて、C# は汎用インターフェイスと汎用デリゲートもサポートします。ジェネリック インターフェイスとジェネリック デリゲートは、ジェネリック クラスやメソッドと同様の方法で使用されます。
ジェネリックの利点には、コードの再利用、型安全性、パフォーマンスの最適化、読みやすさの向上などがあります。ジェネリックスを使用すると、より柔軟で汎用性の高いコードを作成でき、コードの保守性と拡張性が向上します。