1.泛型定义
泛型(Generic)是C#2.0推出的新语法,他提供了一种更准确的使用一种以上的类型代码的方式。泛型允许开发人员声明类型参数化的代码,开发人员可以用不同的类型进行实例化。通俗的讲,就是一个方法可以传入不同类型的参数,可以执行相同的算法。
在C#1.0时,我们可以通过Object类型来实现同样的功能,但是此过程存在的装箱、拆箱会损耗程序的性能。
2.泛型作用
为了满足不同类型,相同代码的重用
3.泛型参数
泛型方法声明的时候,没有指定类型,而是在调用的时候指定。
泛型是延迟声明的:即定义的时候没有指定具体的参数类型,把参数类型的声明推迟到了调用的时候才指定参数类型。 延迟思想在程序架构设计的时候很受欢迎。例如:分布式缓存队列、EF的延迟加载等等。
编译器编译泛型时会做相应的处理(生成占位符),调用的时候,会把占位符替换成具体的数据类型。
3.泛型实现形式
3.1.泛型类
/// <summary>
/// 泛型类
/// </summary>
/// <typeparam name="T"></typeparam>
public class GenericClass<T>
{
public T _T;
}
// T是int类型
GenericClass<int> genericInt = new GenericClass<int>();
genericInt._T = 123;
3.2.泛型接口
/// <summary>
/// 泛型接口
/// </summary>
public interface IGenericInterface<T>
{
//泛型类型的返回值
T GetT(T t);
}
3.3.泛型委托
public delegate void SayHi<T>(T t);//泛型委托
4.调用
4.1.调用要指明类型
/// <summary>
/// 使用泛型的时候必须指定具体类型,
/// 这里的具体类型是int
/// </summary>
public class CommonClass :GenericClass<int>
{
}
4.2.如果继承的子类也是泛型,可以不指明具体类型
/// <summary>
/// 子类也是泛型的,继承的时候可以不指定具体类型
/// </summary>
/// <typeparam name="T"></typeparam>
public class CommonClassChild<T>:GenericClass<T>
{
}
4.3.泛型接口实现
/// <summary>
/// 必须指定具体类型
/// </summary>
public class Common : IGenericInterface<string>
{
public string GetT(string t)
{
throw new NotImplementedException();
}
}
/// <summary>
/// 可以不知道具体类型,但是子类也必须是泛型的
/// </summary>
/// <typeparam name="T"></typeparam>
public class CommonChild<T> : IGenericInterface<T>
{
public T GetT(T t)
{
throw new NotImplementedException();
}
}
5.泛型约束
泛型约束,实际上就是约束的类型T。使T必须遵循一定的规则。
泛型约束实现:只需要where关键字,加上约束的条件。
6.泛型的协变、逆变
协变和逆变是在.NET 4.0的时候出现的,只能放在接口或者委托的泛型参数前面,out 协变covariant,用来修饰返回值;in:逆变contravariant,用来修饰传入参数。
参考资料:https://www.cnblogs.com/dotnet261010/p/9034594.html