C#中的S:new()是什么意思?

9

在下面的代码中,我不知道 "where S : new()" 的含义是什么。有什么关键字可以在Google中查找更多信息吗?

    public virtual void Print<S, T>() 
        where S : new() 
    { 
        Console.WriteLine(default(T)); 
        Console.WriteLine(default(S)); 
    } 

1
搜索类型参数的约束。这里是链接http://msdn.microsoft.com/en-us/library/d5x73970.aspx。 - qwr
6
这是一个重复的问题,原问题链接为C# code confusion of where clause,我是通过在SO上搜索[c#] generic where new找到的。此外,在相关问题侧边栏中,还有一个关于where T : new()的问题What does new() do in where T : new() - Raymond Chen
1个回答

16

new()约束表示特定泛型参数需要具有默认构造函数(即没有参数的构造函数)。

通常,这样做是为了让您在不使用反射/Activator.CreateInstance的情况下,安全地构造泛型参数类型的新实例。

例如:

public T Create<T>() where T : new()
{
    // allowed because of the new() constraint
    return new T();
}

更多信息请查看http://msdn.microsoft.com/en-us/library/sd2w2ew5%28v=vs.80%29.aspx

至于Google搜索词,我建议尝试“c# new()约束”。


1
正式名称为“构造函数约束”,因此您也可以在Google上搜索。当然,“约束”是最重要的词。请注意,如果T恰好是值类型,则new T();不会调用真实的实例构造函数;它构造与值类型相同的值,如default(T)。因此,不允许结合值类型约束和构造函数约束,因此这是非法的:where T : struct, new()(被认为是多余的)。如果T是引用类型,则default(T)给出一个空引用,而new T();调用一个真正的构造函数。 - Jeppe Stig Nielsen
任何值类型,包括预定义的整数类型和枚举类型,都满足构造函数约束。只有引用类型满足它,当且仅当它(非抽象并且)具有**public**零参数实例构造函数。(抽象类不应该有public构造函数。) - Jeppe Stig Nielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接