c# - c#、java中的null是什么?

标签 c# java null

就像...是像 C++ 中的 0 吗?或者它是一些“特殊”对象?或者可能是完全不同的东西?

-- 编辑--

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

最佳答案

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

在 C# 中,“null”可以是三种情况。引用、指针和可为 null 的类型。

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

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

null 可空值类型 也由 zeroes 实现,但方式不同。当你说

内部? j = null;

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

struct NullableInt 
{
    int value;
    bool hasValue;
}

具有适当的访问器方法,等等。当这些东西之一被分配为空时,我们只需用零位填充整个东西。该值为整数零,hasValue 中填充了零,因此变为 false; hasValue 字段设置为 false 的可空类型被认为是空的。

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

关于c# - c#、java中的null是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2028298/

相关文章:

java - 如何在 Android Studio 中删除导入的模块

java - 基本家庭作业问题我做错了什么

c++ - 为什么在指向对象的指针数组周围存在未初始化的堆内存? (C++)

c# - 为什么 ReadOnlyCollection<> 不包含 FindAll()、FindFirst()、

c# - 将列表传递给任务

c# - 如何在 C# 中实现 C++ 风格的函数指针?,不使用委托(delegate)

javascript - 在访问属性之前检查对象是否不为空

c# - 在断开连接的环境 (EF) 中使用 Db 生成的 ID 更新实体图 ID

java - Java 中的 64 位分配在 32 位机器上是原子的吗?

sql - SQL计数空字段