考虑以下代码:
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/