У меня другое поведение, когда я пытаюсь ленить инициализировать некоторые данные - отлаживая и работая без отладки. При отладке этого кода свойство, кажется, получает оценку даже до его вызова! При запуске без отладки это не происходит (какое-то состояние гонки?).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
Отладчик предполагает, что Getters свободны от побочных эффектов, и, таким образом, если у вас есть это в вашем списке часов, он будет его оценивать. – Cine
Или просто мышь над полем :) –
@Cine, да. Ты прав. отладчик, кажется, оценивает его. Просто проверка значения в locals устанавливает значение. – AdmiralThrawn