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

本文关键字:调试 模式 声明 局部变量 | 更新日期: 2023-09-27 18:21:35

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

int a; // local variable

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

事实上,C#规范说:

由局部变量声明引入的局部变量不是自动初始化,因此没有默认值

但是,如果我在调试模式下运行Visual Studio,它会显示a是否将0作为默认值?

为什么?可能是相对于IL代码?

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

在显式初始化之前不能使用本地是C#中内置的一条规则,用于防止错误。如果你试图使用一个你没有分配的变量,那很可能是一个错误。

编译器实际将本地值初始化为"零"或"null"值并不是真正相关的。这不是编译器需要做的事情。可能只是出于某种原因,编译器设计者更简单的事情。

使用规格报价编辑的响应:

我想说,这仍然符合规范,因为在C#程序的上下文中,如果不初始化变量,你就无法观察到它。因此,在上下文中,它没有初始化。我非常怀疑调试器是否真的应该遵守同样的确定赋值规则我们知道,在调试器的帮助下,它在创建时被设置为0。但是编译器也知道you没有为它赋值,并且可以将变量视为未初始化。

整数不可为null,其默认值为始终0

您所做的是关于变量的"自动化"之一。

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

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

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

"初始化前不能使用"是一种安全措施。和往常一样,当你打印出一个你没有以任何方式设置的变量时。。。。。。你会得到完全垃圾的数据(0代表int,null代表其他,…),因此你总是应该只在变量以某种方式初始化时才从中读取。当它被禁止时,无论以何种方式,你都可以将其视为一种安全功能。

编辑:为了更清楚地说明"Default"值和"initialized To"可能有点令人困惑。这样,它们就可以具有ANY值,并且只设置为允许的值,并且可以表示无效状态,例如null表示可为null,其他一些值(在本例中为0)表示不可为null。本质上,这些变量并不是故意初始化的。它们似乎只是被设置为一个在其范围内的值(即使编译器仍然将它们视为未初始化)。