c# - 循环中的变量声明不会重置为默认值

标签 c# loops compiler-construction declaration

考虑以下代码:

for (int i = 0; i < 10; i++)
{
    bool b;          /* #1 */
    if (i == 0)
    {
        b = true;    /* #2 */
    }
}


我在#1和#2处设置了断点。

第一次(i = 0),b在#1处设置为false,在#2处设置为true。

第二次(i = 1),b在#1处为真。

这对我来说没有意义,因为我假设在第二个循环(i = 1)中启动时,b在声明时应再次为false。

我假设在第二个循环的#1中b = false。

有人在乎解释吗?

最佳答案

请注意,如果您尝试

for (int i = 0; i < 10; i++)
{
    bool b;          /* #1 */

    if (!b)
    {
        i = 100000;
    }

    if (i == 0)
    {
        b = true;    /* #2 */
    }
}


您将得到一个编译错误,因为变量必须在使用前进行初始化

但是出于您的好奇心...

如果查看IL,您会注意到b被声明为local。

.maxstack 2
.locals init (
    [0] int32 i,
    [1] bool b,
    [2] bool CS$4$0000
)


这意味着在将方法加载到堆栈时已分配了堆栈空间。它使用的空间在方法执行期间不会改变,因此除非您使用b = default(typeof(bool));之类的值告诉它,否则它不会重置。

关于c# - 循环中的变量声明不会重置为默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24264667/

相关文章:

python - 如何从一个列表中获取一个值并将其应用于另一列表中的所有值

java - 无限二维数组搜索

c# - 在返回空 200 响应的 WebAPI 操作方法中抛出 HttpResponseException

c# - 来自外部程序集的 ApiControllers 的属性路由

java - 如何在 Java 中实现 A*?

.net - VB.NET: bool 值来自 `Nothing` 有时是 `false` 有时是 Nullreference-Exception

c - Intel 64 ISA 中类型转换的说明是什么

c++ - 编译器如何从 C++ 的新 final 关键字中受益?

c# - HttpClient.DeleteAsync 和 Content.ReadAdStringAsync 总是返回 null

c# - 断开连接后,C#客户端/服务器套接字将无法再次连接