关于C#泛型中的new()约束
2004-10-07 22:00
190 查看
对于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;
}
也就是说,仍然是用反射机制来获取泛型对象的实例的。
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;
}
也就是说,仍然是用反射机制来获取泛型对象的实例的。
相关文章推荐
- C#之旅
- c#如何获得硬盘的物理序列号
- 使用WMI列出Windows中某个目录的用户权限(C#)
- 捕捉DataGrid的双击事件(C#版本)
- Visual C#中的多线程编程
- Visual C# 对话框全接触 (转)
- C#的事件机制
- 如何在C# 中使用WMI 实现远程查询和共享
- 用C#操纵IIS(代码)
- 在Windows下让不同用户使用不同的分辨率(C# 2005)
- Regular Expression 正则表达式-1 (C#)
- Regular Expression 正则表达式-1 (C#)
- 一步一步用Visual C#创建Web服务
- What Is C#?
- 用C#.net轻松制作不规则窗体
- 用C#改变你的桌面墙纸
- C#程序编码规范
- C#中一些字符串操作的常用用法
- [刘巍]由C#风潮想起的-给初学编程者的忠告
- 使用C#创建webservice及三种调用方式