在“public T SomeMethod <t>(字符串项)中使用new()的用例有哪些用例,其中T:new();”</t>

时间:2014-02-28 19:34:59

标签: c# oop generics design-patterns

我正在尝试在声明

中识别使用various uses cases的{​​{1}}
new()

我知道编译器会确保public T SomeMethod<T>(string item) where T : new(); 必须有一个默认的构造函数。但在所有情况下,这都有帮助。

我已经完成了这个link

5 个答案:

答案 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方法,但是除非添加约束,否则无法保证该类型实际上具有无参数构造函数。