如何理解泛型中的new()约束

一:为什么需要New约束

假设有这样一个需求,它需要在定义一个泛型类时同时实例化T对象。有网友说了:"这还不简单,我立刻给你写一个",刷刷刷,得到以下的例子。

public class GenericTester<T>
{
private T t;
public GenericTester()
{
t = new T();
}
}

不好意思,这位粗心的网友就是我。在这里,我犯了一个最大的惯性错误:主观的认为T永远为Object类型,无构造参数。那话又说回来了,这段不带New约束的错误代码会给调用客户带来什么问题呢?

假设客户在使用这个泛型类时传递了如下的T型参数:

GenericTester<User> t = new GenericTester<User>();

public class User
{
public User(int userId,string userName)
{
...
}
}

这时,这段代码在编译时不能发现错误的,一旦当程序运行时就会抛出异常。

因此使用New的真正原因是:

客户调用这个泛型类时,强制编译器检查泛型类型是否为无参构造函数,防止客户传递多参构造函数类,避免运行时抛出异常,增加程序BUG。

二: .net实例化T对象机制原理

由于T在运行时才会知道具体的类型,在这里.net通过反射机制实例化T对象,楼上代码其实等同于:

public class GenericTester<T> where T : new()
{
private T t;
public GenericTester()
{
t = System.Activator.CreateInstance<T>();
}
}

三:最后注意点
1.当一个泛型参数有多个约束时,New约束要放在最后面。

上一篇:Atitit.常用分区api的attilax总结


下一篇:关于DLL的学习