我试图找出various uses cases
使用new()
在声明
public T SomeMethod<T>(string item) where T : new();
我知道,编译器将确保T
必须有一个默认的构造函数。 但是,在什么都的情况,这是有帮助的。
我已经通过了这个链接
我试图找出various uses cases
使用new()
在声明
public T SomeMethod<T>(string item) where T : new();
我知道,编译器将确保T
必须有一个默认的构造函数。 但是,在什么都的情况,这是有帮助的。
我已经通过了这个链接
MSDN自己的网页上where T : new()
列出了最常见的情况:
应用新的约束,当你的泛型类创建类型的新实例,如下面的示例中的类型参数:
class ItemFactory<T> where T : new()
{
public T GetNewItem()
{
return new T();
}
}
约束还要求参数的构造函数是公开的 。
这是有益的,如果在你的代码的任何地方,你需要创建T的新实例 - 例如,在一个通用的工厂方法。 如果不确保参数的构造函数,你的代码不能创建一个实例(因为你不知道在构造函数签名是什么样子)。
这是有用的,如果你的泛型方法/类必须创建指定类型的实例。 如果你有创建一个泛型类型的方法:
public void DoWork<T>() where T : new() {
var thing = new T();
}
VS:
public void DoWork<T>() {
var thing = new T(); - runtime says "wtf are you doing? i cant create a
new T because T might not have a public
parameterless constructor"
}
public T SomeMethod<T>(string item) where T : new();
约束“T”为具有类型默认(无参数)构造器。
您将无法使用这种类型的(会出错)
public class CustomTypeA{
public CustomTypeA(int count){}
}
而这一个是允许的,
public class CustomTypeB{
}
而这一次也是,
public class CustomTypeC{
public CustomTypeC(){}
}
另外要注意,这种类型的约束会接受所有的结构T的(INT,双等)。 由于结构总是有一个默认的构造器。
鉴于这些possiblitis,它是有用的:1)当你要约束上面列表中。 2)当您要实例(调用其构造函数)这样的类型,而无需使用反射。
这种约束的一点是,编译器将保证您指定的任何类型的T
都会有公共参数的构造函数,使此代码工作:
var instance = new T();
但是请注意,上面的代码实际上将变成一个呼叫Activator.CreateInstance(Type)
,这意味着保证是你所得到的。 你可以调用Activator.CreateInstance
自己的方法,但是你不能保证类型实际上有一个参数的构造函数,除非你加约束。