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

  • 相关阅读:
    CF431E Chemistry Experiment
    BZOJ 4173: 数学
    BZOJ 2426: [HAOI2010]工厂选址
    BZOJ 2580: [Usaco2012 Jan]Video Game
    BZOJ 4237: 稻草人
    BZOJ 2434: [Noi2011]阿狸的打字机
    BZOJ 3881: [Coci2015]Divljak
    BZOJ 2754: [SCOI2012]喵星球上的点名
    BZOJ 1009: [HNOI2008]GT考试
    BZOJ 3731: Gty的超级妹子树
  • 原文地址:https://www.cnblogs.com/cstao110/p/3618643.html
Copyright © 2020-2023  润新知