2010-11-28 125 views

回答

13

这通过调用默认创建的类型A的新实例,无参数的构造函数:

A a = new A(); 

这为A类型的默认值分配给变量a,并且不调用任何构造的所有:

A a = default(A); 

的主要区别在于,一个类型的默认值是null为参照的文ce类型和所有值类型的零位值(因此default(int)将是0,default(bool)将是false等)。

+6

@Fermaref - 不知道你在哪里。声明`var x = default(TestClass);`将`null`赋给`x` – 2010-11-28 02:06:40

+0

没问题,我发现我的错误。我尝试使用它的时候向它提供了一个类型值参数,而不是类型名称,这只适用于泛型。对不起。 – Femaref 2010-11-28 09:42:00

0

新关键字始终表示引用类型的内存分配。实际上没有其他构造会为您即将创建的数据在内存中创建空间。对于值类型,它们的内存在函数或过程中使用时总是预先分配的。 default关键字允许泛型类型返回其默认(未初始化)值,或者null作为参考类型。

2

对于值类型,没有区别,因为值类型的默认构造函数总是等于默认值(T)。它只是用0,null,0.0 ...填充所有内容。在.net的默认实现中,这只对应于用二进制零填充变量中的所有内容。

对于引用类型new T()调用默认构造函数并返回(通常)非空引用。
default(T)在这种情况下相当于null

default(T)很重要,因为它表示T的有效值,而不管T是参考类型还是值类型。这在通用编程中非常有用。
例如,在函数FirstOrDefault中,如果可枚举项没有条目,则需要一个有效的结果值。而你只是使用default(T),因为它是唯一适用于每种类型的东西。

另外调用引用类型的默认构造函数需要一个通用约束。并不是每个引用类型都实现一个默认的构造函数。所以你不能总是使用它。