При каких обстоятельствах присвоение в C # не может изменить значение переменной? - PullRequest
1 голос
/ 21 марта 2009

Такое поведение настолько странно, что я даже не знаю, как лучше задать вопрос.

Учитывая следующий фрагмент кода C #:

public class Foo {
  private bool _value = true;

  // ...

  protected void Method()
  { 
    _value = true;
    if(!_value) {
      throw new Exception("What the...?!?!");
    }
  }
}

При подключении отладчика Visual Studio к приложению, выполняющему версию этого кода и проходящем через выполнение Method() (используя шаг в или шаг за шагом), блок if оценивается и выдается исключение. Устанавливая часы для переменной _value, я вижу, что значение _value равно false в начале метода и не изменяется, когда я перехожу через / в оператор присваивания. Что еще интереснее, исключение составляет , а не , если я продолжаю выполнение (F5), хотя все по-прежнему не работает правильно.

Я столкнулся с этим, когда пытался выяснить, почему тестовые случаи NUnit работали при запуске с использованием ReSharper из Visual Studio, но не работали при запуске в графическом интерфейсе NUnit. Я подключил отладчик к графическому интерфейсу NUnit, установил несколько точек останова в тестах, которые неожиданно провалились, нашел места, где переменные не были установлены должным образом, которые должны быть установлены на основе вышеупомянутой переменной _value, которая является своего рода флагом указав, что материал грязный или нет), и, таким образом, заметил странное поведение, при котором _value не изменился (объект, создающий исключение, был добавлен позже и подтверждает, что я использовал правильные скомпилированные сборки!).

Итак, как на счет этого? Чем можно объяснить вышеупомянутое поведение?

Ответы [ 6 ]

4 голосов
/ 21 марта 2009

Посмотрите, изменяется ли получатель свойства _value. Отладчик оценит свойства и, следовательно, ваше значение может измениться.

3 голосов
/ 21 марта 2009

Поскольку исключение фактически не выдается в некоторых сценариях, я думаю, что это тот случай, когда отладчик смотрит на неверный источник или неправильную версию.

1 голос
/ 21 марта 2009

Попробуйте перестроить свое решение (в меню Visual Studio выберите: Построить -> Перестроить решение), а затем повторите попытку.

1 голос
/ 21 марта 2009

Другой поток может повлиять на значение поля в состоянии гонки.

0 голосов
/ 21 марта 2009

Единственное объяснение, которое я могу придумать, это то, что другой поток изменяет значение. Как вы вызываете Method ()?

0 голосов
/ 21 марта 2009

У меня когда-то был похожий сценарий на работе. Было значение, которое было определенно ложным, и то же самое, что и у вас, у меня было if (значение) {...} и блок if был выполнен. После долгих потягиваний волос это стало проблемой версий. До сих пор я не до конца понимаю, что произошло, но после удаления ссылки из моего приложения на эту сборку, извлечения его из gac, его восстановления, повторного добавления и повторного добавления ссылки в мой проект Сработало как положено. Я не знаю, возможно ли это в вашем сценарии, но попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...