泛型
带有<>符合的类型,就叫泛型
T:Type
作用:代码重用,提高效率,类型安全
分类:泛型方法,泛型类
泛型方法:
Public T 方法名
{
}
基本使用
public static T SayHello<T>(T t)
{
return t;
}
int i = SayHello<int>(1);
string ii = SayHello<string>("a");
double db = SayHello<double>(3.14);
Program pro = SayHello<Program>(new Program());
Children children = SayHello<Children>(new Children());
//用泛型当作参数使用时,在调用该方法时,可以根据参数推断出类型,也就是可以在使用时不用给类型,直接写参数
public static void Show<T>(T param)
{
Console.WriteLine(param.GetType().Name + " " + param);
}
//当返回值使用,调用这个方法时候再具体给返回值类型
public static T Show<T>()
{
//为什么不能直接返回T,因为值类型可以为null,引用类型不可以为null,而且在这个方法里还不确定具体返回是值类型还是引用类型。
//default关键字,如果返回的是一个为空的引用类型,那就返回null,值类型就返回0,
return default(T);
}
//当局部变量使用,一般都要加约束
public static T Show<T>(int a) where T : struct
{
T t = new T();//值类型都有一个隐式的公共无参数的构造方法
return t;
}
泛型类
//泛型类
public class Person<T>
{
public T Name { get; set; }
}
泛型约束
可以限制泛型传递的类型
where T:struct :限制T必须是值类型
where T:class :限制T必须是引用类型
where T:new() :限制T必须有一个无参构造函数
where T:具体的类 :类本身和它的子类
组合约束:where T:具体的类,new()
比如:要求数泛型必须是某个类的子类
public static T SayHello<T>(T t) where T : Program, new()
{
return t;
}
Program pro = SayHello<Program>(new Program());
Children children = SayHello<Children>(new Children());
上面用到的Children类是Program的子类