对C#泛型中的new()约束思考

对于new()约束,大家可能有一个误解,以为使用了new约束之后,在创建对象时与非泛型的版本是一致的:
<public class Tester<T> 
where T:new() 

public Tester() 

t = new T();//等同于非泛型版本的new? 例如 object o = new object();? 

private T t; 
}  
事实上,使用new关键字的作用只是让编译器在泛型实例化之处,检查所绑定的泛型参数是否具有无参构造函数: 
Tester<SomeType> t = new Tester<SomeType>(); 
//此处编译器会检查SomeType是否具有无参构造函数。若没有则会有compile error。  
而Tester<T>类的构造函数中的new代码,实际上等同于下面的代码: 
public class Tester<T> 
where T:new() 
{ public Tester() 
{ t = System.Activator.CreateInstance<T>(); } 
private T t; 
}  
也就是说,仍然是用反射机制来获取泛型对象的实例的。

时间: 2024-12-10 20:58:06

对C#泛型中的new()约束思考的相关文章

泛型中的类型约束和类型推断

前一篇文章介绍了泛型的基本概念.在本文中,我们看一下泛型中两个很重要的特性:类型约束和类型推断. 类型约束 相信你还记得前面一篇文章中的泛型方法,在这个泛型方法中,我们就使用了类型约束. 类型约束(type constraint)进一步控制了可指定的类型实参,当我们创建自己的泛型类型或者泛型方法的时候,类型约束是很有用的. 回到前一篇例子中的泛型方法,这个泛型方法就要求可指定的类型实参必须实现了IComparable接口. 为什么会有这个约束呢?原因很简单,因为我们在泛型方法的实现中直接调用T类

编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]

前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用.事件本身也是委托,它是委托组,C#中提供了关键字event来对事件进行特别区分.一旦我们开始编写稍微复杂的C#代码,就肯定离不开泛型.委托和事件.本章将针对这三个方面进行说明. 这里也有一篇之前我对泛型的简

Java泛型解析(04):约束和局限性

Java泛型解析(04):约束和局限性 前两节,认识和学习了泛型的限定以及通配符,初学者可能需要一些时间去体会到泛型程序设计的好处和力量,特别是想成为库程序员的同学就需要下去体会通配符的运用了,应用程序员则需要掌握怎么使用泛型,这里针对泛型的使用中的约束和局限性做一个介绍性的讲解. 不能用基本类型实例化类型参数 这个很好理解,实例化泛型类时泛型参数不能使用基本类型,如List<int>这是不合法的,要存储基本类型则可以利用基本类型的包装类如List<Integer> .List&l

java泛型中的通配符

概述 在学习java中泛型这块内容的时候,刚开始非常容易理解,但是,到通配符的时候,我就晕了,因为学习java这块内容的指导思想,是比对着.net来的,可是java中的通配符,.net中没有这样的概念,于是花时间学习了一下,下面通过例子向大家讲解通配符 实例代码 package com.tgb.mydemo; import java.util.ArrayList; import java.util.List; public class Test { public static void main

Java泛型中的PECS原则

今天在写代码的时候使用到了这样一个方法签名: public void foo(Map<String, String> map); 在写这个参数的时候正好在想一些关于泛型的东西,于是: public void foo(Map<? extends String, ? extends String> map); 这两种写法有什么区别呢?记得以前和同学讨论过这个问题,但后来没有记下来,渐渐又淡忘了.今天又去翻了好多资料,总算找到一些可以参考的,赶紧记在这里方便以后温故知新啦.好了,言归正传

Java泛型中extends和super的理解(转)

E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定的java类型(无限制通配符类型) S.U.V – 2nd.3rd.4th types Object – 是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T.E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换. ?

泛型中的协变和逆变

[泛型中的协变和逆变] 协变指能够使用比原始指定的派生类型的派生程度更大的类型,逆变指能够使用比原始指定的派生类型的派生程度更小的类型. 协变与逆变的本质就是参数的替换.逻辑不变,只进行参数的替换,以实现更高程序的复用. 通常,协变类型参数可用作委托的返回类型,而逆变类型参数可用作参数类型. 对于接口,协变类型参数可用作接口的方法的返回类型,而逆变类型参数可用作接口的方法的参数类型. 协变是out,逆变是in. 协变的例子: 逆变的例子,When the delegate of type Act

PowerDesigner中如何添加约束

唯一约束 唯一约束与创建唯一索引基本上是一回事,因为在创建唯一约束的时候,系统会创建对应的一个唯一索引,通过唯一索引来实现约束.不过唯一约束更直观的表达了对应列的唯一性,使得对应索引的目的更加清晰,所以一般建议创建唯一约束而不是只创建唯一索引. 在PD中创建唯一约束的操作,以教室表来说,RoomID是主键,必然是唯一的,RoomName如果我们也要去必须是唯一的,那么具体操作如下: 在PD的模型设计面板中,双击"教室"表,打开属性窗口,切换到""Keys"

&lt;转&gt;关于 error LNK2019:无法解析的外部符号 ,该符号在函数**中被引用的思考

错误提示信息摘抄如下: -------------------------------------------------------------------------------------------------- 错误         12     error LNK2019: 无法解析的外部符号 [email protected], 该符号在函数"public: class activemq::util::Guid & __thiscall activemq::util::Gu