【问题标题】:Why int can't be null? How does nullable int (int?) work in C#?为什么 int 不能为空?可为空的 int (int?) 在 C# 中如何工作?
【发布时间】:2023-03-21 14:00:02
【问题描述】:

我是 C# 新手,刚刚了解到对象可以在 C# 中为空,但 int 不能。

还有 nullable int (int?) 如何在 C# 中工作?

【问题讨论】:

  • 我会投资一本关于 C# 的好书。你肯定会有更多关于这样的基本语法的问题,并且在 SO 上单独询问它们会占用大量时间。
  • @Bart:我看到这是一个 jleedev 链接到的骗子,但这个问题更具体到具有可为空值类型的 C#...
  • 人们对结束问题和查找重复问题更感兴趣,而不是查看被问到的问题并回答问题。这个问题不是所有标记的重复,但人们仍然将其标记为重复,其余同意并关闭它。我想他们都没有看过问题。

标签: c# object int nullable


【解决方案1】:

int 是原始类型,只有 ReferenceTypes(对象)可以为空。您可以通过将 int 包装在一个对象中来使其可以为空:

System.Nullable<int> i;

-或-

int? i;

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/nullable-types/using-nullable-types

【讨论】:

  • int? 是否比 int 慢?它会占用更多内存吗?
  • @AaronFranke 是的,被包裹在一个额外的对象中。
【解决方案2】:

int 是一种值类型。它实际上是 Int32 类型。可以为空的对象是引用类型。在基本层面上,区别在于值类型将值与变量一起存储,而引用类型将存储对值的引用。引用可以为空,这意味着它不指向值。值类型总是有值的。

Nullable 包装了一个值类型,让您可以选择是否为空。使用整数?只是声明可空类型的编译器快捷方式。

【讨论】:

    【解决方案3】:

    您可以通过使用 int 来获得可为空的 int 吗?或Nullable&lt;int&gt; 两者完全相同。

    【讨论】:

      【解决方案4】:

      int 这样的值类型包含直接值,而不是像ReferenceType 这样的引用。值不能为空,但引用可以为空,这意味着它没有指向任何内容。一个值不能没有任何内容。一个值总是包含某种值

      Nullable 或 Nullable 类型是特殊的值类型,除了值类型的正常值之外,还支持额外的 null 值,就像引用类型一样

      【讨论】:

        【解决方案5】:

        对象是引用类型,可以不引用任何内容或NULL,而int是值类型,只能保存一个值,不能引用任何内容。

        【讨论】:

          【解决方案6】:

          原始的 int 类型不能用它的二进制表示来表示 null,但是Nullable&lt;int&gt; 增加了一个额外的字节来表示这个值的 null 信息。

          【讨论】:

          • 有人投反对票应该说明原因。 Nullable 在结构体定义中额外增加一个私有bool 字段hasValue 来表示int 的null,此外,在与null 比较时,需要对CLR 进行一些修改以处理这种特殊的结构体。原始 int 不能表示 null,因为它的所有二进制排列都表示 int 的值,条件是它在堆栈中有 4 个字节。
          • 我没有否决它,但可能是因为引用了一个关于内存布局的模糊事实而没有任何支持文档。否则,我不确定。
          猜你喜欢
          • 2011-08-25
          • 1970-01-01
          • 2010-09-24
          • 1970-01-01
          • 2013-07-30
          • 2019-11-12
          • 1970-01-01
          • 2016-01-22
          • 2020-05-31
          相关资源
          最近更新 更多