我正在与同事进行对话,并且出现了null的主题。他在幕后告诉我,在.NET中它只是一个非常小的数字。我一直认为对象只是没有指向堆上任何内存的指针,但我不确定。
所以我希望社区可以为我们清理它; P
答案 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,那么检查就会被执行。