将局部变量和值声明为调试模式

Declaration of local variables and values into debug mode

在 C# 中,我知道如果我在方法中写入如下语句:

int a; // local variable

那我不能在初始化之前使用它。

事实上,C# 规范说:

A local variable introduced by a local-variable-declaration is not automatically initialized and thus has no default value

但是如果我在调试模式下 运行 Visual Studio 它显示 a0 作为默认值?

为什么?可能与 IL 代码有关。 ?

整数不可为空,它的默认值是总是 0

您看到的是关于变量的 "automatisms" 之一。

有些变量(如字符串)可以为 null,这意味着它们可以有 null 作为值,因此如果它们没有被初始化,这是它们的默认值。

其他变量如(大多数)数字变量不可为 null,因此不能将 null 作为值。对于这些变量,如果它们未初始化,则有不同的默认值。比如整数 0.

请注意,对于 nullable 我不是指 ?像int这样的变量?但实际上是类型本身的变量,如果它可以具有空值。

"can't be used before initialization" 是一项安全措施。通常当你打印出一个你没有以任何方式设置的变量时......你得到完全垃圾数据(0 为 int,null 为其他人,......)因此你总是应该只读以某种方式初始化的变量。无论以何种方式禁止时,您都可以将其视为一项安全功能。

编辑:为了使 "Default" 值更清晰一些,"initialized to" 在这里可能有点混乱。这样它们就可以有任何值,并且只设置为它们允许的值,并且可以表示无效状态,例如 null 表示可空,其他值(在本例中为 0)表示不可空。本质上,这些变量并不是有意初始化的。它们只是看似设置为在其范围内的值(即使编译器仍将它们视为未初始化)。

不能在显式初始化之前使用局部变量这一事实是 C# 中为防止错误而内置的规则。如果您尝试使用您尚未分配给的变量,那很可能是一个错误。

编译器实际上将局部变量初始化为它们的 'zero' 或 'null' 值并不真正相关。这不是编译器 需要 做的事情。可能只是出于某种原因对编译器设计者来说更简单。

响应编辑规范引用:

我想说这仍然符合规范,因为在 C# 程序的上下文中,您无法在不初始化变量的情况下观察变量。因此,在上下文中,它没有被初始化。我非常怀疑调试器真的应该遵守相同的明确分配规则。 我们知道,在调试器的帮助下,它在创建时被设置为 0。但是编译器也知道 you 没有给它赋值,可以把这个变量当作未初始化的。