Eri*_*ert 17
由于您询问的是实现细节而不是语义,因此答案特定于给定的实现.
C#中有三个"null"可以.引用,指针和可空类型.
CLR上的C#实现表示零位的空引用.(其中位数是适合您正在运行的CLR的特定版本上的托管指针的大小.)
不出所料,空指针以相同的方式表示.您可以在C#中通过创建一个不安全的块,使空指针变为void,然后将其转换为IntPtr,然后将IntPtr转换为int(或64位系统上的long)来证明这一点.果然,你会得到零.
null 可空值类型也由零实现,但方式不同.当你说
诠释?j = null;
我们实际创造的是道德等同于:
struct NullableInt
{
int value;
bool hasValue;
}
Run Code Online (Sandbox Code Playgroud)
使用适当的访问方法等.当其中一个东西被赋值为null时,我们只用零位填充整个东西.该值为整数零,并且hasValue用零填充,因此变为false; hasValue字段设置为false的可空类型被视为null.
我不知道C#/ CLI的其他实现的实现细节.如果他们不同,我会感到惊讶; 这是实现null的明显而明智的方法.但是如果您对特定的实现细节有疑问,那么您将不得不问一个知道您感兴趣的实现的人.
还有一个特殊的null类型,表达式的类型为null,没有名称.由于null类型没有名称,因此无法声明null类型的变量或转换为null类型.空引用是null类型表达式的唯一可能值.null引用始终可以强制转换为任何引用类型.实际上,程序员可以忽略null类型,只是假装null只是一个可以是任何引用类型的特殊文字.