什么是c#,java中的null?

2022-09-03 17:14:17

喜欢。。。就像在C++吗?还是一些“特殊”的物体?或者也许是完全不同的东西?0

-- 编辑 --

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


答案 1

由于您询问的是实现细节,而不是语义,因此答案特定于给定的实现。

C# 中有三个“null”可以是”引用、指针和可为 null 的类型。

CLR 上 C# 的实现表示零位的空引用。(其中,位数是作为您正在运行的特定版本的 CLR 上的托管指针的适当大小。

不出所料,空指针的表示方式相同。在 C# 中,可以通过创建一个不安全的块,创建一个指向 void 的空指针,然后将其转换为 IntPtr,然后将 IntPtr 转换为 int(或 long,在 64 位系统上)来演示这一点。果然,你会得到零。

值可为 null 的值类型也由零实现,尽管方式不同。当你说

int?j = 空;

我们实际创造的东西在道德上等同于:

struct NullableInt 
{
    int value;
    bool hasValue;
}

使用适当的访问器方法,依此类推。当其中一个被赋值为空时,我们只用零位填充整个事物。该值是整数零,hasValue 用零填充,因此变为 false;如果 hasValue 字段设置为 false,则可为 null 的类型被视为 null。

我不知道C#/ CLI的其他实现的实现细节是什么。如果他们不同,我会感到惊讶;这是实现空值的明显且明智的方法。但是,如果您对特定的实现细节有疑问,则必须询问了解您感兴趣的实现的人。


答案 2

由于 Java 和 C# 在虚拟机上运行,因此物理上用于表示 null 的内容并不重要,而且在各个实现之间也不一定相同。

重要的是语言规范中定义的 null 的行为(有关详细信息,请参阅 Dan 和 MRFerocius 的答案)。基本上,它是引用类型的变量可以保存并且不能取消引用的特殊值。

顺便说一句,作为参考点,Java 序列化规范使用单字节值0x70来表示空引用。