6

我正在与一位同事交谈,并且出现了 null 的主题。他告诉我,在幕后的 .NET 中,这只是一个非常小的数字。我一直认为该对象只是没有指向堆上任何内存的指针,但我不确定哪种方式。

所以我希望社区可以为我们清理它;P

4

4 回答 4

16

是 0。

从 ECMA-335 规范中的 ldnull 截取:

可能会认为 ldnull 是多余的:为什么不改用 ldc.i4.0 或 ldc.i8.0 呢?答案是 ldnull 提供了一个与大小无关的 null - 类似于不存在的 ldc.i 指令。但是,即使 CIL 包含 ldc.i 指令,保留 ldnull 指令仍然有利于验证算法,因为它使类型跟踪更容易。

于 2008-12-29T22:51:53.883 回答
7

当可空类型实例设置为空时,其基础值为零。

更具体地说,可空类型是将基础类型的值与布尔空指示符组合在一起的结构。可空类型的实例具有两个公共只读属性:bool 类型的HasValue和可空类型的基础类型的Value

HasValue对于非空实例为真,对于空实例为假。

因此,当HasValue为 true 时,Value属性返回包含的值。当HasValue为 false 时,访问 Value 属性的尝试会引发异常。但是,如果您可以访问它,您会发现它包含零。

于 2008-12-30T00:01:11.700 回答
0

根据我的经验,我相信Nothing会奏效,也会如此DBNull.Value

于 2008-12-29T22:49:38.693 回答
-2

来自MSDN

null 关键字是表示空引用的文字,它不引用任何对象

为了尝试在旧版本的 c# 中使其更清晰一点,值类型不能为空,即它必须有一个值,如果你没有分配一个值,你会得到一个潜在的随机值,比如:

int i;
i++;
console.writeline(i);

在旧版本的 c# 中,对象必须被初始化,否则它们为空,这意味着它们没有对任何对象的引用。

现在在 c# 2.0+ 中使用可为空的值类型,您可以拥有一个可为空的 int,这意味着如果您有以下代码:

int? i;
i++;
console.writeline(i);

实际上,您将在 i++ 处遇到异常,因为 i 从未被初始化为 null 以外的任何内容。如果 null 为 0,则此代码将正常执行,因为它只会计算为 0+1,但这是不正确的行为。

如果 null 始终为 0,并且您有一个可为空的 int,并且您编写了一些代码,例如:

int? i;
if (int == 0)
{
//do something
}

如果 null 与 0 相同,则很有可能会出现一些意外行为,因为编译器无法区分 int 为 null 和 int 显式设置为 0。

另一个澄清我脑海中事情的例子:

public int? AddNumbers(int? x, int? y)
{
    if (x == null || y == null)
        return null;
    if (x == 0)
        return y;
    if (y == 0)
        return x;

    return x + y;
}

在这个例子中,很明显 null 和 0 是非常不同的,因为如果你为 x 或 y 传入 0,并且 null 等于 0,那么上面的代码将永远无法检查 x == 0 或 y == 0,但是如果您运行代码并为 x 或 y 传递 0,则检查确实会执行。

于 2008-12-29T23:15:53.773 回答