2016-10-03 3 views
0

У меня другое поведение, когда я пытаюсь ленить инициализировать некоторые данные - отлаживая и работая без отладки. При отладке этого кода свойство, кажется, получает оценку даже до его вызова! При запуске без отладки это не происходит (какое-то состояние гонки?).Lazy Инициализация поведения свойства C# по-разному во время отладки

У меня есть точки останова на линиях B2 и C2. Чтобы было ясно: я никогда не ожидал увидеть в следующей строке получить печататься, но я вижу это во время отладки .. 2: Проверка HasValue: Правда, 10/2/2016 10:10:56 PM

Могу ли я делать что-то неправильно в отношении использования публичных свойств или это не правильный способ сделать ленивую инициализацию?

namespace ConsoleApplication2 
{ 
    using System; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("A2. Time is : {0}", DateTime.Now); 
      var testNullablebool = new TestNullableBool(); 
      Console.WriteLine("B2. Time is : {0}", DateTime.Now); <BreakPoint here> 
      Console.WriteLine("C2. Time is : {0}", DateTime.Now); <BreakPoint> 
      Console.WriteLine("Answer 2: {0}, {1}", testNullablebool.IsFoundAnswer, DateTime.Now); 
     } 
    } 

    public class TestNullableBool 
    { 
     private bool? isFound; 

     public bool IsFoundAnswer 
     { 
      get 
      { 
       Console.WriteLine("2: Checking hasvalue: {0}, {1}", isFound.HasValue, DateTime.Now); 
       if (!isFound.HasValue) 
       { 
        if (DateTime.Now < DateTime.UtcNow) 
        { 
         Console.WriteLine("2: This is true, {0}", DateTime.Now); 
         isFound = true; 
        } 
        else 
        { 
         Console.WriteLine("2: This is false, {0}", DateTime.Now); 
         isFound = false; 
        } 
       } 
       return isFound.Value; 
      } 
     } 
    } 
} 

Выхода без не отладок (без точек останова !!):

A2. Time is : 10/2/2016 10:11:54 PM 
B2. Time is : 10/2/2016 10:11:54 PM 
C2. Time is : 10/2/2016 10:11:54 PM 
2: Checking hasvalue: False, 10/2/2016 10:11:54 PM 
2: This is true, 10/2/2016 10:11:54 PM 
Answer 2: True, 10/2/2016 10:11:54 PM 
Press any key to continue . . . 

выхода с точкой останова и пошаговым:

A2. Time is : 10/2/2016 10:10:23 PM 
B2. Time is : 10/2/2016 10:10:45 PM 
C2. Time is : 10/2/2016 10:10:51 PM 
2: Checking hasvalue: False, 10/2/2016 10:10:51 PM 
2: This is true, 10/2/2016 10:10:51 PM 
2: Checking hasvalue: True, 10/2/2016 10:10:56 PM 
2: Checking hasvalue: True, 10/2/2016 10:10:58 PM 
Answer 2: True, 10/2/2016 10:10:59 PM 
2: Checking hasvalue: True, 10/2/2016 10:10:59 PM 
+2

Отладчик предполагает, что Getters свободны от побочных эффектов, и, таким образом, если у вас есть это в вашем списке часов, он будет его оценивать. – Cine

+0

Или просто мышь над полем :) –

+1

@Cine, да. Ты прав. отладчик, кажется, оценивает его. Просто проверка значения в locals устанавливает значение. – AdmiralThrawn

ответ

0

Цитированием комментария выше в качестве ответа - так что я могу закрыть это вопрос.

Отладчик предполагает, что Getters свободны от побочных эффектов, и, таким образом, если у вас есть это в вашем списке часов, он будет его оценивать. - @Cine

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