什么是c#,java中的null?

就像……在C ++中它是0吗? 或者它是一些“特殊”的对象? 或者也许完全不同的东西?

– 编辑 –

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

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

C#中有三个“null”可以。 引用,指针和可空类型。

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

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

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

诠释? j = null;

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

 struct NullableInt { int value; bool hasValue; } 

使用适当的访问方法等。 当其中一个东西被赋值为null时,我们只用零位填充整个东西。 该值为整数零,hasValue用零填充,因此变为false; 将hasValue字段设置为false的可空类型视为null。

我不知道C#/ CLI的其他实现的实现细节。 如果他们不同,我会感到惊讶; 这是实现null的明显而明智的方法。 但是如果您对特定的实现细节有疑问,那么您将不得不问一个知道您感兴趣的实现的人。

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

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

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

Java语言规范第4.1节 :

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

来自Microsoft MDSN:

null关键字是一个表示空引用的文字,一个不引用任何对象的引用。 null是引用类型变量的默认值。 普通值类型不能为空。 但是,C#2.0引入了可空值类型。 请参阅可空类型(C#编程指南)。

在C#中为null

它是一个特殊的参考(区别于0),它指向任何东西。

null是对任何东西的“引用”,因此它几乎没有指向任何东西。

附加信息:AC#引用类型可以指向null(即:nothing),类似int的值类型不能指向null,尽管可以在Nullablegenerics引用类型中使用valuetype。

Null几乎没有。 在某些情况下,某些语言(如PHP)会将null等同为0,false,空字符串等。 Java和C#是强类型语言。 因此,没有任何“有用的”隐式转换发生。 所以null实际上是null或什么都不是。 Null仅等于null。 没有其他比较会返回真实。

它相当于

 #define NULL (void*)0 

在c ++中。 所以基本上,是的,它是零。

编辑:因为我显然没有正确地说出这个答案…

我的意思是:

由于C#在VM中运行,Michael Borgwardt所说的是正确的,我们不知道它在幕后的表现如何。 但是,如果您使用以下代码:

  unsafe static void Main(string[] args) { if (((void*)0) == null) Console.WriteLine("true"); else Console.WriteLine("false"); Console.ReadKey(); } 

并在控制台应用程序中编译它,启用“允许不安全代码”,您将看到在c#中,null确实等于(void *)0。