在C#中,我知道如果我在方法中写下这样的语句:
int a; // local variable
然后我无法在初始化之前使用它。
事实上,C#规范说:
由local-variable-declaration引入的局部变量不是 自动初始化,因此没有默认值
但是,如果我在调试模式下运行Visual Studio,它会显示a
有0
作为默认值?
为什么呢?可能是它与IL代码有关。 ?
答案 0 :(得分:4)
在显式初始化之前您不能使用本地的事实是C#中内置的规则,以防止错误。如果您尝试使用尚未分配的变量,那很可能是一个错误。
编译器实际上将本地人初始化为他们的“零”'或者' null'价值并不真正相关。它不是编译器需要做的事情。可能只是因为某种原因而在编译器设计者身上变得更简单。
使用规范引用编辑回复:
我会说这仍然符合规范,因为在C#程序的上下文中,如果不初始化它,就无法观察变量。因此,在上下文中,它没有初始化。我非常怀疑调试器是否真的需要遵守明确赋值的相同规则。 我们在调试器的帮助下知道它在创建时设置为0。但编译器也知道你没有为它分配任何东西,并且可以将变量视为未初始化。
答案 1 :(得分:2)
整数不可为空,它的默认值始终 0
答案 2 :(得分:2)
你所看到的是"自动化"关于变量。
某些变量(如字符串)可以为空,这意味着它们可以将null作为值,因此如果它们未初始化,则这是它们的默认值。
其他变量(如(大多数)数字变量)不可为空,因此不能为null。对于这些变量,如果未初始化,则会有不同的默认值。喜欢整数0。
请注意,可以使用nullable并不意味着?变量如int?但实际上是类型本身的变量,如果它可以具有空值。
&#34>无法在初始化之前使用"是一种安全措施。通常当你打印出一个你没有以任何方式设置的变量时......你会得到完全垃圾数据(0表示int,null表示其他人,...)因此你总是应该只在变量以某种形式初始化时从变量中读取。无论以何种方式禁止它,您都可以将其视为安全功能。
编辑:使其更清晰"默认"值和"初始化为"这里可能有点令人困惑。它们可以具有任何值,并且只是设置为它们允许的值,并且可以表示无效状态,例如null,可以为空,而其他值(在本例中为0)表示不可为空。实质上,这些变量并非故意初始化。它们似乎设置为一个在其范围内的值(即使编译器将它们视为未初始化的)。