喜欢......在C ++中是0
吗?还是一些“特殊”的对象?或者可能是完全不同的东西?
- 编辑 -
我确实知道它是什么,问题是 - 它是如何完成的
答案 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)
答案 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。没有其他比较会回归真实。