为什么int可以';不能为空?可空int(int?)在C#中如何工作?

为什么int可以';不能为空?可空int(int?)在C#中如何工作?,c#,object,int,nullable,C#,Object,Int,Nullable,我是C#新手,刚刚了解到对象在C#中可以为null,但int不能 另外,可为NULL的int(int?)在C#中是如何工作的?对象是引用类型,它们可以不引用任何内容或NULL,但是int是一种值类型,只能保存一个值,不能引用任何内容。像int这样的值类型包含直接值,而不是像ReferenceType这样的引用。值不能为null,但引用可以为null,这意味着它没有指向任何内容。值中不能没有任何内容。一个值总是包含某种值 可空或可空类型是特殊的值类型,除了值类型的正常值之外,还支持其他空值,就像引

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


另外,可为NULL的int(
int?
)在C#中是如何工作的?

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

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


可空或可空类型是特殊的值类型,除了值类型的正常值之外,还支持其他空值,就像引用类型一样,int是一种值类型。它实际上是Int32类型的。可以为null的对象是引用类型。在基本级别上,区别在于值类型将使用变量存储值,而引用类型将在其中存储对值的引用。引用可以为null,这意味着它不指向值。其中值类型始终具有值


Nullable包装了一个值类型,允许您选择为null。使用int?只是声明可空类型的编译器快捷方式。

基元int类型不能在其二进制表示形式中表示null,但
可空
添加了一个额外的字节来表示此值的null信息。

基元int是基元类型,只有
引用类型
s(对象)可以为null。通过将
int
包装到对象中,可以使其为空:

System.Nullable<int> i;

您可以通过使用int获得一个可为空的int?或者
Nullable
两者完全相同。

我会投资买一本关于C#的好书。你肯定会有很多关于基本语法的问题,像这样,单独问他们会占用很多时间。@Bart:我知道这是一个jleedev链接到的问题的翻版,但这个问题对于具有可空值类型的C#来说更为具体……ppl更感兴趣的是结束问题并找到重复的问题,而不是寻找被问的问题并回答它。此问题并非所有已标记问题的副本,但ppl仍将其标记为副本,其他人同意并关闭该问题。我想他们没有一个人看过这个问题。投反对票的人应该说明原因。Nullable在结构定义中添加一个额外的私有bool field
hasValue
,以表示int的null,此外,在与null进行比较时,CLR需要稍微修改以处理此特殊结构。原语int不能表示null,因为在堆栈中有4个字节的情况下,它的所有二进制排列都表示int的值。我没有否决它,但可能是因为引用了一个关于内存布局的模糊事实,而没有任何支持文档。否则,我不确定。
int?
int
慢吗?它会占用更多的内存吗?@AaronFranke是的,会被一个额外的对象包裹起来。
int? i;