什么是c#,java中的null?

时间:2010-01-08 14:51:07

标签: c# java null

喜欢......在C ++中是0吗?还是一些“特殊”的对象?或者可能是完全不同的东西?

- 编辑 -

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

9 个答案:

答案 0 :(得分:17)

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

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

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

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

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

INT? j = null;

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

struct NullableInt 
{
    int value;
    bool hasValue;
}

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

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

答案 1 :(得分:9)

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

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

BTW,作为参考点,Java serialization spec使用单字节值0x70来表示空引用。

答案 2 :(得分:7)

Java Language Specification section 4.1

  

还有一个特殊的null类型   表达式的类型为null,具有   无名。因为null类型没有   名字,不可能申报   null类型的变量或者要转换   到null类型。空引用   是唯一可能的价值   null类型的表达式。 null   引用总是可以转换为任何引用   参考类型。在实践中,   程序员可以忽略null类型   并假装null只是一个   可以是任何特殊文字   参考类型。

答案 3 :(得分:2)

来自Microsoft MDSN:

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

答案 4 :(得分:1)

这是null in C#

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

等同于

#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。

答案 8 :(得分:0)

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