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

Tim*_*ter 17 c# vb.net debugging breakpoints visual-studio-2010

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

foo = "bah"
Run Code Online (Sandbox Code Playgroud)

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

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

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

这是一个小样本"程序"和来自我(德国)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
}
Run Code Online (Sandbox Code Playgroud)

断点条件对话框:

在此输入图像描述

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

在此输入图像描述

Han*_*ant 7

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

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

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

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


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

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