概述:
C#中的泛型(Generics)是一种允许在编写类、方法和委托时使用参数化类型的机制。泛型允许我们编写更通用、可重用的代码,可以避免类型转换和重复编写类似的代码。
泛型的基本语法如下所示:
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#还支持泛型接口和泛型委托。泛型接口和泛型委托的使用方式与泛型类和泛型方法类似。
泛型的优点包括代码重用、类型安全、性能优化和更好的可读性。通过使用泛型,我们可以编写更加灵活、通用的代码,提高了代码的可维护性和可扩展性。