C# 在什么情况下C中的赋值不能改变变量';s值多少?

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调试器附加到执行此代码版本

这种行为太奇怪了,我甚至不知道该怎么问这个问题

给出以下C#代码片段:

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,但不一定在需要时重新复制。因此,是的,很可能是调试器使用了错误的版本。谢谢