如何在.NET中表示null

时间:2008-12-29 22:47:44

标签: .net memory null

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

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

4 个答案:

答案 0 :(得分:16)

它是0。

在ECMA-335规范中从ldnull剪断:

  

可能以为ldnull是   冗余:为什么不使用ldc.i4.0或   ldc.i8.0而不是?答案是这样的   ldnull提供与大小无关的null -   类似于ldc.i指令,   哪个不存在。但是,即使   CIL包括一个ldc.i   指示它仍然会受益   验证算法保留   ldnull指令,因为它   类型跟踪更容易。

答案 1 :(得分:5)

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

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

HasValue 对于非null实例为true,对于null实例为false。

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

答案 2 :(得分:0)

根据我的经验,我相信Nothing会起作用,DBNull.Value

也会如此

答案 3 :(得分:-2)

来自MSDN

  

null关键字是一个文字   表示空引用,即一个   不引用任何对象

为了尝试在旧版本的c#中使它更清晰一点,值类型不能为空,即它有一个值,如果你没有赋值,你有一个潜在的随机值所以像:

int i;
i++;
console.writeline(i);
旧版本的c#对象中的

必须初始化,否则它们为null,这意味着它们没有引用任何对象。

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

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

你实际上会在i ++上得到一个异常,因为我从未被初始化为null以外的任何东西。如果null为0,则此代码执行正常,因为它只是评估为0 + 1,但这是不正确的行为。

如果null始终为0并且您有一个可以为null的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,那么检查就会被执行。