对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-09-11 10:00:58

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

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

原文:编写高质量代码改善C#程序的157个建议[优先考虑泛型.避免在泛型中声明静态成员.为泛型参数设定约束] 前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用.事件本身也是委托,它是委托组,C#中提供了关键字event来对事件进行特别区分.一旦我们开始编写

在Oracle9i中定义视图约束

在Oracle9i出现之前,Oracle视图总是从它们的基表(base tables)中动态产生的,并且视图中不能包含约束.通过隐藏所有的内部表格连接操作,Oracle视图可以简化复杂的查询.  例如,下面的视图用以显示五金(widget)产品的订货信息. create or replace view   widget_ordersasselect   cust_name,   order_date,   product_name,   sum(qty*price) total costfrom

简单分析.net泛型中的类型参数

一位朋友询问tppeof.GetType().is.as的问题,在实验的时候顺手就用泛型写的例子.在看Jit后的反汇编时发现了一个问题,clr对泛型参数有些特殊处理.上网查了一下没有找到介绍泛型参数存储的文章因此动手做了一番实验,有了些浅显的理解在此记录下来望看到此文的高手能给予全面的解释. 以前用泛型的时候没想过clr是如何处理泛型参数的,今天查阅了下<<Expert .NET 2.0 IL Assembler>>里面讲解了一个叫做GenericParam Metadata Ta

PHP中的类型约束介绍

  这篇文章主要介绍了PHP中的类型约束介绍,PHP的类方法和函数中可实现类型约束,但参数只能指定类.数组.接口.callable 四种类型,参数可默认为NULL,PHP并不能约束标量类型或其它类型,需要的朋友可以参考下 PHP的类方法和函数中可实现类型约束,但参数只能指定类.数组.接口.callable 四种类型,参数可默认为NULL,PHP并不能约束标量类型或其它类型. 如下示例: 代码如下: class Test { public function test_array(array $ar

java-ja v a 泛型中的擦除问题

问题描述 ja v a 泛型中的擦除问题 java泛型是后加入的概念,既然"擦除"机制不合理,为何不对java进行修改呢? 解决方案 为了java版本的向下兼容.否则一些老代码就不能再新jdk中跑了. 解决方案二: 这个问题我回答不了, 我只知道泛型相关的用法, java编程思想里可能有相关的解释你可以看下

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等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换. ?

ios-iOS中textView设置约束后,在不同模拟器上显示内容位置不一样?

问题描述 iOS中textView设置约束后,在不同模拟器上显示内容位置不一样? iOS中textView在添加约束后,为什么在iphone5和iPhone6的模拟器上显示不一样?就是当内容多于textView高度时,如果你textView的约束是在320宽的xib中限制的,那么textView在iPhone5模拟器上:内容从上面开始显示:在iPhone6模拟器上:内容从下面开始显示.反之,如果你的textView的约束是在宽度为375的xib中限制的,iPhone6模拟器上:内容从上面开始显示

android AsyncTask后面的泛型中三个类型参数是什么意思?顺序可以变么?

问题描述 android AsyncTask后面的泛型中三个类型参数是什么意思?顺序可以变么? android AsyncTask后面的泛型中三个类型参数是什么意思?顺序可以变么? 解决方案 根據做過的Project,顺序不可以变 解决方案二: 必须不可以,分别是传入参数类型,中间参数类型和传出参数的类型

iOS 泛型中nullable、null resettable、null kindof 用法详解_IOS

 iOS9新出的关键字:用来修饰属性,或者方法的参数,方法的返回值 iOS9新出关键字nonnull,nullable,null_resettable,_Null_unspecified 需要注意的一点只能修饰对象,不能修饰基本数据类型. 虽然在项目的代码编写中不会经常用到,不过在调用苹果系统方法的时候还是会经常遇到,需要做一个总结 nullable作用:表示可以为空 nullable书写规范: // 方式一: @property (nonatomic, strong, nullable) NS