如何理解泛型中的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约束要放在最后面。

转载于:https://www.cnblogs.com/cstao110/p/3618643.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值