将可空整数初始化为默认值的最佳实践?
Best practice for initializing a nullable integer to default value?
我 运行 进入一些设置可为空整数的代码,如下所示:
int? xPosition = new int?();
这对我来说是一种陌生的语法。我会期望这些形式之一:
int? xPosition = null;
int? xPosition = default(int?);
这三个变量声明在功能上有什么区别吗?
无功能差异。这三个都必须实例化一个 int?
,然后由于默认值为 HasValue == false
,其中的 none 需要后续成员分配。
在你的例子中,最好的方法是:
int? xPosition = null;
但是,在不同的场景下,其他的方式可能会更好,甚至是唯一的可能。例如,在接收不同类型数据的代码中,default
是可行的方法,因为默认值取决于类型,并不总是 null
。例如,如果某些代码可能会收到 int
或 int?
,那么您不知道 null
上的默认值是否为零,因此使用 default
可以保证您会得到正确的默认值。
这种情况的一个例子是使用 LINQ。
根据规范,这些都是等价的:
4.1.10 可空类型
An instance for which HasValue is false is said to be null. A null instance has an undefined value
4.1.2 默认构造函数
所有值类型都隐式声明一个 public 无参数实例构造函数,称为默认构造函数。默认构造函数 returns 一个零初始化的实例,称为值类型的默认值:
• 对于结构类型,默认值是通过将所有值类型字段设置为其默认值并将所有引用类型字段设置为空而生成的值。
可空类型是结构,HasValue
是一个默认值为 false
的布尔值,所以 new int?()
为空。
5.2 默认值
变量的默认值取决于变量的类型,决定如下:
• 对于值类型的变量,默认值与值类型的默认构造函数(§4.1.2)计算的值相同。
所以default(int?)
等价于new int?()
我 运行 进入一些设置可为空整数的代码,如下所示:
int? xPosition = new int?();
这对我来说是一种陌生的语法。我会期望这些形式之一:
int? xPosition = null;
int? xPosition = default(int?);
这三个变量声明在功能上有什么区别吗?
无功能差异。这三个都必须实例化一个 int?
,然后由于默认值为 HasValue == false
,其中的 none 需要后续成员分配。
在你的例子中,最好的方法是:
int? xPosition = null;
但是,在不同的场景下,其他的方式可能会更好,甚至是唯一的可能。例如,在接收不同类型数据的代码中,default
是可行的方法,因为默认值取决于类型,并不总是 null
。例如,如果某些代码可能会收到 int
或 int?
,那么您不知道 null
上的默认值是否为零,因此使用 default
可以保证您会得到正确的默认值。
这种情况的一个例子是使用 LINQ。
根据规范,这些都是等价的:
4.1.10 可空类型
An instance for which HasValue is false is said to be null. A null instance has an undefined value
4.1.2 默认构造函数
所有值类型都隐式声明一个 public 无参数实例构造函数,称为默认构造函数。默认构造函数 returns 一个零初始化的实例,称为值类型的默认值:
• 对于结构类型,默认值是通过将所有值类型字段设置为其默认值并将所有引用类型字段设置为空而生成的值。
可空类型是结构,HasValue
是一个默认值为 false
的布尔值,所以 new int?()
为空。
5.2 默认值
变量的默认值取决于变量的类型,决定如下:
• 对于值类型的变量,默认值与值类型的默认构造函数(§4.1.2)计算的值相同。
所以default(int?)
等价于new int?()