什么是c#,java中的null?

arg*_*rgh 14 c# java null

就像...... 0在C++中是这样的吗?还是一些"特殊"的对象?或者也许完全不同的东西?

- 编辑 -

我知道它是什么,问题是 - 如何完成的

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的明显而明智的方法.但是如果您对特定的实现细节有疑问,那么您将不得不问一个知道您感兴趣的实现的人.


Mic*_*rdt 9

由于Java和C#在虚拟机上运行,​​因此在物理上使用什么来表示null并不重要,并且在实现之间不一定相同.

重要的是null 的行为,如语言规范中所定义的(有关详细信息,请参阅Dan和MRFerocius的答案).基本上,它是一个特殊值,引用类型的变量可以容纳,并且不能解除引用.

BTW,作为参考点,Java序列化规范使用单字节值0x70来表示空引用.


Dan*_*yer 7

Java语言规范第4.1节:

还有一个特殊的null类型,表达式的类型为null,没有名称.由于null类型没有名称,因此无法声明null类型的变量或转换为null类型.空引用是null类型表达式的唯一可能值.null引用始终可以强制转换为任何引用类型.实际上,程序员可以忽略null类型,只是假装null只是一个可以是任何引用类型的特殊文字.