为什么调试器的断点条件允许赋值语句为bool-condition?

这是非常危险的,所以我想知道为什么它是允许的。 由于我经常需要在VB.NET和C#之间切换,我有时会添加断点条件,如下所示:

foo = "bah" 

我想停止,如果string变量foo"bah ,所以正确的方法是使用foo == "bah"而不是foo = "bah"

但它“有效”。 在编译或运行时,您不会收到任何警告或错误。 但实际上这会修改变量foo ,即使它有不同的值,它也总是"bah" 。 由于这种情况无声地发生(断点永远不会被击中),因此非常危险。

为什么允许? 我的推理错误在哪里(除了混淆C#和VB.NET语法)? 在C#中(与VB.NET相反) 赋值语句返回已分配的值,因此不是bool ,而是在这种情况下为string 。 但是如果你选中“Is True”框,断点条件必须是一个bool

这是一个小样本“程序”和我(德国)IDE的截图:

 static void Main() { string foo = "foo"; // breakpoint with assignment(foo = "bah") instead of comparison(foo == "bah"): Console.WriteLine(foo); // bah, variable is changed from the breakpoint window } 

断点条件对话框:

在此处输入图像描述

作为图像的代码包括断点:

在此处输入图像描述

它是C#语法的自动结果,在花括号语言组中很常见。 赋值也是一个表达式,其结果是右侧操作数的值。 调试器既不会反对具有副作用的表达式,也不会简单地抑制它们。 可以归咎于没有检查表达式是否有bool结果,但是调试器没有完整的C#语言解析器。 由于Roslyn项目,这可能在VS2015中得到修复。 [注:见底部的附录]。

也是卷括号语言需要一个单独的运算符进行相等的核心原因,== vs =。 每个C程序员至少要犯一次这样的错误,这本身就必须导致价值十亿美元的错误。

VB.NET不同,赋值是一个语句, = token对分配和比较都有效。 您可以从调试器中获知,它选择了相等运算符,而不是修改变量。

请记住,这实际上很有用。 它允许您临时解决错误,强制变量值并允许您继续调试并专注于另一个问题。 或者创建一个测试条件。 这非常有用。 在之前的一生中,我编写了一个编译器和调试器并实现了“跟踪点”。 偶然发现了相同的场景并将其留在原地。 它运行在严重依赖状态机的主机上,覆盖状态变量,而调试非常有用。 事故,不,没那么有用:)


关于其他SO用户观察的内容的说明,取决于您使用的调试引擎。 VS2013中的相关选项是Tools + Options,Debugging,General,“Use Managed Compatibility Mode”复选框。 VS2012中存在相同的选项,它的名称略有不同(不记得了)。 勾选后,您将获得一个较旧的调试引擎,该引擎仍然与C ++ / CLI兼容。 与VS2010中使用的相同。

这是VS2013的一种解决方法,取消选项以让调试器检查表达式是否产生bool结果。 您可以使用新的调试引擎获得更多好处,例如查看方法返回值和编辑+继续支持64位进程。

我可以不同意这种行为的错误性质。 在我的生活中用于调试目的的几个例子如果有用:
1.其他线程修改代码中的内容。
2. db中的其他服务更新值
因此,我认为对于同步的情况,它可能是有用的function,但我同意它可能会导致问题