我遇到了一些代码,它设置了一个可以为空的整数:
int? xPosition = new int?();
这对我来说是一种不熟悉的语法。我会期待这些形式中的任何一种:
int? xPosition = null;
int? xPosition = default(int?);
这三个变量声明之间是否存在功能差异?
答案 0 :(得分:6)
没有功能差异。所有三个都必须实例化int?
,然后由于默认值为HasValue == false
,所以它们都不需要后续的成员分配。
答案 1 :(得分:0)
在您的示例中,最好的方法是:
int? xPosition = null;
然而,在不同的情况下,其他方式可能更好,甚至是唯一的可能性。例如,在接收不同类型数据的代码中,default
是可行的方法,因为默认值取决于类型,并不总是null
。例如,如果某些代码可能会收到int
或int?
,那么您就不知道null
上的默认值是否为零,因此使用default
可以保证您将获得正确的默认值。
这种情况的一个例子就是使用LINQ时。
答案 2 :(得分:0)
根据规范,这些都是等效的:
4.1.10可空类型
HasValue为false的实例被称为null。 null实例具有未定义的值
4.1.2默认构造函数
所有值类型都隐式声明一个名为默认构造函数的公共无参数实例构造函数。默认构造函数返回零初始化实例,称为值类型的默认值:
•对于struct-type,默认值是通过将所有值类型字段设置为其默认值并将所有引用类型字段设置为null而生成的值。
可空类型是结构,HasValue
是bool,默认值为false
,因此new int?()
为空。
5.2默认值
变量的默认值取决于变量的类型,并确定如下:
•对于value-type的变量,默认值与value-type的默认构造函数(第4.1.2节)计算的值相同。
所以default(int?)
相当于new int?()