最近在学习代码的时候发现对泛型约束不是很了解,花时间在网上学习了下,现在在这里做个总结吧。
泛型约束主要就是用于在泛型类中对于泛型类所接受的参数的某些特性进行设置。先来说说为什么要使用泛型约束吧。打个比方,一个泛型基类中的某个方法的实现需要调用参数类型生成的实例的Compare方法,但是参数类型不是我们所能够控制的,我们需要在程序编译的时候加入对参数类型的检查,这个时候就要用到泛型约束了。
泛型约束基本上有五种:
- 值类型约束:要求泛型参数必须是值类型,例如int,short以及自定义的stuct等
public class MyClass2<T>
where T : struct//这个泛型类只接受值类型的泛型参数
{
}
- 引用类型约束:要求泛型参数必须是引用类型,例如string,object,以及自定义的class
public class MyClass<T>
where T:class//这个泛型类只接受引用类型的泛型参数
{
}
- 构造函数约束:要求泛型参数必须有构造函数
public class MyClass3<T>
where T : new()
{
}
- 接口约束:要求泛型参数必须实现某个接口
public class MyClass4<T>
where T : System.IComparable
{
}
- 基类约束:要求泛型参数必须继承某个基类
public class MyClass5<T>
where T : Customer
{
}
BlogEngine中的BusinessBase泛型基类就使用到了泛型基类,下面我贴上代码
1 | public abstract class BusinessBase<TYPE, KEY> : IDataErrorInfo, INotifyPropertyChanged, IChangeTracking, IDisposable where TYPE : BusinessBase<TYPE, KEY>, new () |