之前面试的时候,有人问过我这个问题,当时自己只记得两种。后来上msdn看了下,发现有三种,第三种用法基本没怎么用过
这里先贴出来:
三种用法如下:
在 C# 中,new 关键字可用作运算符、修饰符或约束。
1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。
前两种方法不说了
直接说第三种:第三种方法我看了半天也没看明白说什么意思,不得不说这个翻译的太拗口了。
然后直接看例子:
new约束指定泛型类声明中的任何类型参数都必须具有公共的无参数构造函数.请看下例:
using System;
using System.Collections.Generic;
namespace ConsoleApplication2
{
public class Employee
{
private string name;
private int id;
public Employee()
{
name = "Temp";
id = 0;
}
public Employee(string s, int i)
{
name = s;
id = i;
}
public string Name
{
get { return name; }
set { name = value; }
}
public int ID
{
get { return id; }
set { id = value; }
}
}
class ItemFactory<T> where T : new()
{
public T GetNewItem()
{
return new T();
}
}
public class Test
{
public static void Main()
{
ItemFactory<Employee> EmployeeFactory = new ItemFactory<Employee>();
////此处编译器会检查Employee是否具有公有的无参构造函数。
//若没有则会有The Employee must have a public parameterless constructor 错误。
Console.WriteLine("{0}'ID is {1}.", EmployeeFactory.GetNewItem().Name, EmployeeFactory.GetNewItem().ID);
}
}
}
注意看例子,通过在泛型中使用new 很好的制定了规则,所有使用该方法的类型 (此处为Employee )必须具备无参的构造函数 否则在 return new T(); 中就报错了。 这样我们就可以运用类似的形式,限制泛型的类型 的构造函数(必须是构造函数,因为所有的类都有构造函数,而如果要其他函数的话,就需要T继承一下)必须是使用XX参数的。(比如f(int ,int))
代码摘自 http://www.cnblogs.com/cpcpc/archive/2011/04/27/2123020.html