什么是“公共牛逼的someMethod有新的()的用例 (串项)其中,T:新的();”(闭合)

2019-10-19 11:21发布

我试图找出various uses cases使用new()在声明

public T SomeMethod<T>(string item) where T : new();

我知道,编译器将确保T必须有一个默认的构造函数。 但是,在什么都的情况,这是有帮助的。

我已经通过了这个链接

Answer 1:

MSDN自己的网页上where T : new()列出了最常见的情况:

应用新的约束,当你的泛型类创建类型的新实例,如下面的示例中的类型参数:

class ItemFactory<T> where T : new()
{
    public T GetNewItem()
    {
        return new T();
    }
}

约束还要求参数的构造函数是公开的



Answer 2:

这是有益的,如果在你的代码的任何地方,你需要创建T的新实例 - 例如,在一个通用的工厂方法。 如果不确保参数的构造函数,你的代码不能创建一个实例(因为你不知道在构造函数签名是什么样子)。



Answer 3:

这是有用的,如果你的泛型方法/类必须创建指定类型的实例。 如果你有创建一个泛型类型的方法:

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"
}


Answer 4:

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)当您要实例(调用其构造函数)这样的类型,而无需使用反射。



Answer 5:

这种约束的一点是,编译器将保证您指定的任何类型的T都会有公共参数的构造函数,使此代码工作:

var instance = new T();

但是请注意,上面的代码实际上将变成一个呼叫Activator.CreateInstance(Type) ,这意味着保证是你所得到的。 你可以调用Activator.CreateInstance自己的方法,但是你不能保证类型实际上有一个参数的构造函数,除非你加约束。



文章来源: What are the use cases of having new() in “public T SomeMethod(string item) where T : new();” [closed]