可空类型“int”的默认值是多少? (包括问号)?
Posted
技术标签:
【中文标题】可空类型“int”的默认值是多少? (包括问号)?【英文标题】:What is the default value of the nullable type "int?" (including question mark)? 【发布时间】:2015-05-23 02:42:31 【问题描述】:在 C# 中,int?
类型的类实例变量的默认值是多少?
例如,在下面的代码中,如果MyNullableInt
从未被显式赋值,它会有什么值?
class MyClass
public int? MyNullableInt;
(似乎答案几乎可以肯定是null
或0
,但它是哪一个?)
【问题讨论】:
为什么投反对票? (如果没有实际运行代码来测试行为,这个问题的答案最初对我来说并不明显;令人惊讶的是,我在 *** 上找不到这个问题的副本,或者通过谷歌在其他地方很容易找到。) 你可能看过here - 谷歌第一次为我点击。 @500 - 我在研究时确实找到了那篇文章 - 实际上我在下面自己的答案中链接到了它 - 但据我所知,这篇文章并没有明确说明可空类型实例的默认值为空。它确实说“HasValue 的默认值为 false。Value 属性没有默认值”,但这并不能直接回答我最初的问题,而无需进行一些额外的挖掘。 我想知道是不是因为你可以设置一个断点看看值是多少,或者在即时窗口中输入int? x;
看看结果是什么?
【参考方案1】:
int?
的默认值 - 以及任何使用“type?”的可空类型声明——是null
。
为什么会这样:
int?
是类型 Nullable<T>(其中 T 是 int
)的语法糖,一个结构。 (reference)
Nullable<T>
类型有一个bool HasValue 成员,当false
时,它使Nullable<T>
实例“表现得像”null
值。特别是,当带有HasValue == false
的Nullable<T>
与实际的null
值进行比较时,Nullable<T>.Equals method 被覆盖以返回true
。
从C# Language Specification 11.3.4 开始,结构实例的初始默认值是该结构的所有值类型字段设置为其默认值,并且该结构的所有引用类型字段设置为null
。
C# 中bool
变量的默认值为false
(reference)。因此,默认Nullable<T>
实例的HasValue
属性为false
;这反过来又使 Nullable<T>
实例本身的行为类似于 null
。
【讨论】:
当我将声明从int? x = null;
更改为 int? x;
时,我在代码中进一步收到编译器错误:“使用未分配的局部变量 x”。
@JohnPick 这是一个 C# 编译器功能,旨在防止由于您在使用变量之前“忘记”初始化变量而可能出现的错误。您可以遇到未初始化的 int 的情况?是当它是类成员变量时。两者的例子:blogs.msdn.microsoft.com/abhinaba/2005/11/08/…
所以基本上这个地方就是你的科技博客?您提出的问题只需要运行代码即可获得答案,然后在同一分钟内自己回答问题。
@JonSchneider 很公平,我的错
VS 的编译器提示/警告具有误导性:Field 'id' is never assigned to, and will always have its default value 0
。是不是很奇怪?【参考方案2】:
我觉得分享Nullable<T>.GetValueOrDefault()
方法很重要,该方法在处理使用Nullable<int>
又名int?
值的数学计算时特别方便。很多时候你不需要检查HasValue
属性,你可以使用GetValueOrDefault()
来代替。
var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == 0", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());
var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == 0", defaultValueOfInt);
Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == 0", defaultValueOfNullableInt.GetValueOrDefault());
【讨论】:
【参考方案3】:var x = default (int?);
Console.WriteLine("x == 0", (x == null) ? "null" : x.ToString());
【讨论】:
以上是关于可空类型“int”的默认值是多少? (包括问号)?的主要内容,如果未能解决你的问题,请参考以下文章
C# 8 中的 Non-Nullable 引用类型的默认值是多少?
Swift-可空链式调用(Optional Chaining)(十五)