我正在尝试在声明
中识别使用various uses cases
的{{1}}
new()
我知道编译器会确保public T SomeMethod<T>(string item) where T : new();
必须有一个默认的构造函数。但在所有情况下,这都有帮助。
我已经完成了这个link
答案 0 :(得分:5)
where T : new()
上的{p> MSDN's own page列出了最常见的用例:
当泛型类创建该类型的新实例时,将新约束应用于类型参数,如以下示例所示:
class ItemFactory<T> where T : new()
{
public T GetNewItem()
{
return new T();
}
}
约束还要求无参数构造函数为 public 。
答案 1 :(得分:2)
如果您的泛型方法/类必须创建给定类型的实例,这将非常有用。如果您有一个创建泛型类型的方法:
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"
}
答案 2 :(得分:2)
如果您需要在代码中的任何位置创建T的新实例(例如,在通用工厂方法中),这将非常有用。如果您不确保无参数构造函数,则您的代码永远不会创建实例(因为您不知道构造函数签名的外观)。
答案 3 :(得分:0)
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(){}
}
另请注意,此类约束将接受所有Struct T(int,double等)。因为结构总是有一个默认的构造函数。
鉴于这些可能性, 它很有用:1)当你想要约束到上面的列表时。 2)当你想要实例化(调用它的构造函数)这样的类型而不使用反射。
答案 4 :(得分:0)
这个约束的要点是编译器会保证你为T
指定的任何类型都有一个公共无参数构造函数,允许这段代码工作:
var instance = new T();
但请注意,上述代码实际上会变成对Activator.CreateInstance(Type)
的调用,这意味着您可以获得保证。您可以自己调用Activator.CreateInstance
方法,但是除非添加约束,否则无法保证该类型实际上具有无参数构造函数。