首页 > 其他 > 详细

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

时间:2014-03-23 12:42:44      阅读:298      评论:0      收藏:0      [点我收藏+]

一:为什么需要New约束

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

bubuko.com,布布扣
public class GenericTester<T>
{
    private T t;
    public GenericTester()
    {
        t = new T();
    }
}
bubuko.com,布布扣


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

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

bubuko.com,布布扣
GenericTester<User> t = new GenericTester<User>();

public class User
{
    public User(int userId,string userName)
    {
       ...
    }
}
bubuko.com,布布扣

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


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

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

 

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

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

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

 

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

如何理解泛型中的new()约束,布布扣,bubuko.com

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

原文:http://www.cnblogs.com/cstao110/p/3618643.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!