C# 在什么情况下C中的赋值不能改变变量';s值多少?
这种行为太奇怪了,我甚至不知道该怎么问这个问题 给出以下C#代码片段:C# 在什么情况下C中的赋值不能改变变量';s值多少?,c#,visual-studio,debugging,C#,Visual Studio,Debugging,这种行为太奇怪了,我甚至不知道该怎么问这个问题 给出以下C#代码片段: public class Foo { private bool _value = true; // ... protected void Method() { _value = true; if(!_value) { throw new Exception("What the...?!?!"); } } } 将Visual Studio调试器附加到执行此代码版本
public class Foo {
private bool _value = true;
// ...
protected void Method()
{
_value = true;
if(!_value) {
throw new Exception("What the...?!?!");
}
}
}
将Visual Studio调试器附加到执行此代码版本的应用程序,并单步执行方法()
(使用单步执行或单步执行),将计算if
块并引发异常。在\u value
变量上设置一个手表,我可以看到\u value
的值在方法的开头是false
,并且不会随着我跨过/进入赋值语句而改变。更有趣的是,如果我继续执行(F5),则不会引发异常,尽管事情仍然无法正常工作
我在试图弄清楚为什么NUnit测试用例在VisualStudio中使用ReSharper运行时可以工作,但在NUnit GUI中运行时失败时遇到了这个问题。我将调试器连接到NUnit GUI,在意外失败的测试上设置一些断点,发现变量设置不正确的地方,应该根据上面提到的\u值变量进行设置,该变量在某种程度上是指示东西是否脏的标志),因此注意到,\u value
没有改变的奇怪行为(异常抛出的东西是后来添加的,验证我使用的是正确的编译程序集!)
那么,怎么样?有什么可能解释上述行为呢?我曾经在工作中遇到过类似的情况。有一个值绝对是假的,和你一样,我有一个if(value){…},if块被执行了。经过长时间的拉扯,这成了一个令人恼火的问题。到目前为止,我还不完全明白发生了什么,但在从我的应用程序中删除对该程序集的引用后,将其从gac中取出,重建它,重新添加它,然后将引用重新添加到我的项目中,它按预期工作。我不知道这在你的场景中是否可行,但是试一试。我曾经在工作中遇到过类似的场景。有一个值绝对是假的,和你一样,我有一个if(value){…},if块被执行了。经过长时间的拉扯,这成了一个令人恼火的问题。到目前为止,我还不完全明白发生了什么,但在从我的应用程序中删除对该程序集的引用后,将其从gac中取出,重建它,重新添加它,然后将引用重新添加到我的项目中,它按预期工作。我不知道这在您的场景中是否可行,但试一试。另一个线程可能会影响竞态条件下字段的值。另一个线程可能会影响竞态条件下字段的值。我能想到的唯一解释是另一个线程正在修改该值。如何调用Method()?我能想到的唯一解释是另一个线程正在修改该值。如何调用Method()?由于在某些场景中实际上没有引发异常,我认为这是调试器查看错误源或错误版本的情况 由于在某些场景中没有实际抛出异常,我认为这是调试器查看错误源或错误版本的情况 查看是否有任何属性getter更改\u值
。调试器将评估属性,因此您的值可能会更改。查看是否有任何属性获取程序更改\u value
。调试器将评估属性,因此您的值可能会更改。尝试重新生成解决方案(在Visual Studio菜单中选择:生成->重新生成解决方案),然后重试。尝试重新生成解决方案(在Visual Studio菜单中选择:生成->重新生成解决方案),然后再试一次。虽然我还没有确认,也不想花时间确认,但我认为这里的问题是VS喜欢为子项目复制引用的DLL,但不一定在需要时重新复制。因此,是的,很可能是调试器使用了错误的版本。谢谢虽然我还没有确认,也不想花时间这样做,但我相信这里的问题是VS喜欢为子项目复制引用的DLL,但不一定在需要时重新复制。因此,是的,很可能是调试器使用了错误的版本。谢谢