可空类型“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;

(似乎答案几乎可以肯定是null0,但它是哪一个?)

【问题讨论】:

为什么投反对票? (如果没有实际运行代码来测试行为,这个问题的答案最初对我来说并不明显;令人惊讶的是,我在 *** 上找不到这个问题的副本,或者通过谷歌在其他地方很容易找到。) 你可能看过here - 谷歌第一次为我点击。 @500 - 我在研究时确实找到了那篇文章 - 实际上我在下面自己的答案中链接到了它 - 但据我所知,这篇文章并没有明确说明可空类型实例的默认值为空。它确实说“HasValue 的默认值为 false。Value 属性没有默认值”,但这并不能直接回答我最初的问题,而无需进行一些额外的挖掘。 我想知道是不是因为你可以设置一个断点看看值是多少,或者在即时窗口中输入int? x; 看看结果是什么? 【参考方案1】:

int? 的默认值 - 以及任何使用“type?”的可空类型声明——是null

为什么会这样:

int? 是类型 Nullable<T>(其中 T 是 int)的语法糖,一个结构。 (reference) Nullable&lt;T&gt; 类型有一个bool HasValue 成员,当false 时,它使Nullable&lt;T&gt; 实例“表现得像”null 值。特别是,当带有HasValue == falseNullable&lt;T&gt; 与实际的null 值进行比较时,Nullable<T>.Equals method 被覆盖以返回true。 从C# Language Specification 11.3.4 开始,结构实例的初始默认值是该结构的所有值类型字段设置为其默认值,并且该结构的所有引用类型字段设置为null。 C# 中bool 变量的默认值为false (reference)。因此,默认Nullable&lt;T&gt; 实例的HasValue 属性为false;这反过来又使 Nullable&lt;T&gt; 实例本身的行为类似于 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&lt;T&gt;.GetValueOrDefault() 方法很重要,该方法在处理使用Nullable&lt;int&gt; 又名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 引用类型的默认值是多少?

Kevin Learn Kotlin:空指针检查

Swift-可空链式调用(Optional Chaining)(十五)

Swift-可空链式调用(Optional Chaining)(十五)

c++ int类型默认值是多少?

int c=8;和int? c=8;有啥区别,作用是?