2016-09-28 2 views
0

я 2 свойства класса определяется следующим образом:C# Класс недвижимости Getter Вызывается Автоматически

private static string _validationError; 
    public static string ValidationError 
    { 
     get { 
      var temp = _validationError; 
      _validationError = "abc"; 
      return temp; 
     } 

     set { _validationError = value; } 
    } 

    public static string CurrentError { get; set; } 

Способ:

public static bool IsErrorStringEmpty() 
    { 
     Console.WriteLine("dddd"); 

     return false; 
    } 

Метод испытания:

[TestMethod] 
    public void ValidationErrorTest() 
    { 
     CurrentError = "My Error"; 

     var empty = IsErrorStringEmpty(); 
    } 

Когда я отлаживать этот тест , это поведение, которое я наблюдаю:

  1. Перед удалением 2-й строки метода проверки ValidationError = null (ожидается).

    enter image description here

  2. Когда он входит в IsErrorStringEmpty(), до того, как первая линия хит, ValidationError = нуль (ожидаемый).

    enter image description here

  3. Тогда правильно, когда он бил по 1-й линии, ValidationError = "ABC". Я не знаю, как этот getter вызывается вообще, хотя у меня нет явного кода до этого момента, чтобы получить доступ к свойству ValidationError.

    enter image description here

У меня есть точки останова в поглотителе, но он не получил удар, и стека вызовов отображается, как показано ниже.

enter image description here enter image description here

Я уверен, что это где-то, но я не могу найти его. Любые указатели приветствуются!

+2

Положите точку разрыва в ваш геттер, а затем посмотрите на стек вызовов, когда ваш код сломается. –

+7

Вы вызываете геттер в отладчике. Вместо этого наблюдайте '_validationError'. –

+0

О, мой! Спасибо :). – AngieM

ответ

4

Вы вызываете геттер в отладчике. Когда код выполняется при оценке свойства для отображения в окне просмотра, он действительно выполняется с реальными побочными эффектами.

Попробуйте посмотреть _validationError.

Побочные эффекты в геттере могут бросить вас на петлю. Лучше их избегать.

2

Как с квантовыми эффектами, вы меняете результат, наблюдая его. Посмотрите, что вы отлаживаете. Вы пытаетесь увидеть, что находится внутри ValidationError, и таким образом вы вызываете геттер.

Вы должны добавить _validationError в свой отладчик вместо ValidationError.

Лучший вопрос, почему это свойство не обновляется во второй раз, когда ваш код останавливается. Вы наблюдали это свойство раньше и не сбрасывали его нигде, поэтому это должно было стать "abc".

Смежные вопросы