C/C++ 和 C# 之间的变量范围差异或调试器中的怪癖?
Difference in variable scope between C/C++ and C# or a quirk in the debugger?
我已经通过替换第二个变量的名称解决了这个问题,因此这是一个低优先级的问题,但我想了解发生了什么。
我的 C# 代码中有这种情况(变量 'list' 的值为“V3”):
foreach (string entry in list.Split()){ // Loop1
...
}
string [] list_statuses = { "V1", "V2", "V3", "V4", ...};
foreach (string entry in list_statuses) { // Loop2
...
}
我期待以下行为:
- 在循环1中,变量'entry'只得到值“V3”,循环运行一次就结束了。
- 在循环 2 中,变量 'entry' 取值“V1”、“V2”、“V3”,...,循环 运行 所有这些时间并结束。
重要提示:循环1中的变量'entry'与循环2中的变量'entry'不同:
Loop1中'entry'的作用域仅限于Loop1,Loop2中使用了一个全新的同名变量
令我惊讶的是,在调试它时,在 Loop2 中,该变量在不同时间获得值“V3”,就好像 C# 没有按预期考虑该变量的范围。
在更改第二个变量的名称时,问题解决了,但我想了解这里发生了什么:
我对变量范围的理解来自 C/C++ 语言。观察到的行为是错误还是 C# 和 C/C++ 之间的变量范围存在差异?
哦,如果这是调试器中的问题:我正在使用 Visual Studio Enterprise 2017,版本 15.9.44。
这是调试器中的一个怪癖:
当我在调试器中检查值时,该值似乎是错误的。
当我在屏幕上打印时,该值似乎是正确的。
出于显而易见的原因,我总是混淆我的代码以隐藏我的源代码并创建一个 so-called 最小且可重现的示例。但在这种情况下似乎是不可能的:当我在我的程序中插入这个问题的代码时,一切似乎都正常。
我相信这个问题可以关闭,说明如果 Visual Studio 中的 C# 调试器似乎无法在变量范围内正常工作,这可能是由于一些奇怪的调试器错误。在这种情况下,我建议:
- 检查真实行为(使用日志)
- 要么使用不同的变量名,以避免问题。
我已经通过替换第二个变量的名称解决了这个问题,因此这是一个低优先级的问题,但我想了解发生了什么。
我的 C# 代码中有这种情况(变量 'list' 的值为“V3”):
foreach (string entry in list.Split()){ // Loop1
...
}
string [] list_statuses = { "V1", "V2", "V3", "V4", ...};
foreach (string entry in list_statuses) { // Loop2
...
}
我期待以下行为:
- 在循环1中,变量'entry'只得到值“V3”,循环运行一次就结束了。
- 在循环 2 中,变量 'entry' 取值“V1”、“V2”、“V3”,...,循环 运行 所有这些时间并结束。
重要提示:循环1中的变量'entry'与循环2中的变量'entry'不同:
Loop1中'entry'的作用域仅限于Loop1,Loop2中使用了一个全新的同名变量
令我惊讶的是,在调试它时,在 Loop2 中,该变量在不同时间获得值“V3”,就好像 C# 没有按预期考虑该变量的范围。
在更改第二个变量的名称时,问题解决了,但我想了解这里发生了什么:
我对变量范围的理解来自 C/C++ 语言。观察到的行为是错误还是 C# 和 C/C++ 之间的变量范围存在差异?
哦,如果这是调试器中的问题:我正在使用 Visual Studio Enterprise 2017,版本 15.9.44。
这是调试器中的一个怪癖:
当我在调试器中检查值时,该值似乎是错误的。
当我在屏幕上打印时,该值似乎是正确的。
出于显而易见的原因,我总是混淆我的代码以隐藏我的源代码并创建一个 so-called 最小且可重现的示例。但在这种情况下似乎是不可能的:当我在我的程序中插入这个问题的代码时,一切似乎都正常。
我相信这个问题可以关闭,说明如果 Visual Studio 中的 C# 调试器似乎无法在变量范围内正常工作,这可能是由于一些奇怪的调试器错误。在这种情况下,我建议:
- 检查真实行为(使用日志)
- 要么使用不同的变量名,以避免问题。