我有一个名为A
的班级。这两个陈述有什么区别?
A a = new A();
A a = default(A);
答案 0 :(得分:13)
这通过调用默认的无参数构造函数来创建类型A
的新实例:
A a = new A();
这会将类型A
的默认值分配给变量a
,并且根本不会调用任何构造函数:
A a = default(A);
主要区别在于类型的默认值对于引用类型是null
,对于所有值类型都是零位值(因此default(int)
将是0
,{{ 1}}将是default(bool)
等等。
答案 1 :(得分:2)
对于值类型没有区别,因为值类型的默认构造函数始终等于default(T)。它只是用0
,null
,0.0
来填充所有内容...在.net的默认实现中,这只对应于用二进制零填充变量中的所有内容。
对于引用类型new T()
,调用默认构造函数并返回(通常)非空引用
另一方面,default(T)
在这种情况下相当于null
。
default(T)
很重要,因为它代表T的有效值,无论T是引用值还是值类型。这在通用编程中非常有用
例如,在FirstOrDefault
之类的函数中,在可枚举没有条目的情况下,您需要一个有效的结果值。你只需使用default(T)
,因为它是唯一对每种类型都有效的东西。
另外,在reference-types上调用默认构造函数需要通用约束。并非每个引用类型都实现默认构造函数。所以你不能总是使用它。
答案 2 :(得分:0)
new关键字始终表示引用类型的内存分配。没有其他构造实际上为您要创建的数据在内存中创建空间。对于值类型,在函数或过程中使用时,它们的内存始终是预分配的。 default
关键字允许泛型类型返回其默认(未初始化)值,或null
作为引用类型。