我正在与一位同事交谈,并且出现了 null 的主题。他告诉我,在幕后的 .NET 中,这只是一个非常小的数字。我一直认为该对象只是没有指向堆上任何内存的指针,但我不确定哪种方式。
所以我希望社区可以为我们清理它;P
是 0。
从 ECMA-335 规范中的 ldnull 截取:
可能会认为 ldnull 是多余的:为什么不改用 ldc.i4.0 或 ldc.i8.0 呢?答案是 ldnull 提供了一个与大小无关的 null - 类似于不存在的 ldc.i 指令。但是,即使 CIL 包含 ldc.i 指令,保留 ldnull 指令仍然有利于验证算法,因为它使类型跟踪更容易。
当可空类型实例设置为空时,其基础值为零。
更具体地说,可空类型是将基础类型的值与布尔空指示符组合在一起的结构。可空类型的实例具有两个公共只读属性:bool 类型的HasValue和可空类型的基础类型的Value。
HasValue对于非空实例为真,对于空实例为假。
因此,当HasValue为 true 时,Value属性返回包含的值。当HasValue为 false 时,访问 Value 属性的尝试会引发异常。但是,如果您可以访问它,您会发现它包含零。
根据我的经验,我相信Nothing
会奏效,也会如此DBNull.Value
来自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,则检查确实会执行。