C# 延迟初始化 属性 调试期间的行为不同
Lazy Initializtion of C# property behaviour different during debugging
当我尝试延迟初始化一些数据时,我有不同的行为 - 在调试时和在 运行 未调试时。在调试这段代码时,属性 似乎在被调用之前就已经被求值了!当 运行 没有调试时,这不会发生(某种竞争条件?)。
我在 B2 和 C2 行有断点。
需要明确的是:我从没想过会看到下面的行被打印出来,但我在调试时看到了它。
2:检查 hasvalue:True,10/2/2016 10:10:56 PM
我是不是在使用 public 属性方面做错了什么,或者这不是进行延迟初始化的正确方法吗?
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
当我尝试延迟初始化一些数据时,我有不同的行为 - 在调试时和在 运行 未调试时。在调试这段代码时,属性 似乎在被调用之前就已经被求值了!当 运行 没有调试时,这不会发生(某种竞争条件?)。
我在 B2 和 C2 行有断点。 需要明确的是:我从没想过会看到下面的行被打印出来,但我在调试时看到了它。 2:检查 hasvalue:True,10/2/2016 10:10:56 PM
我是不是在使用 public 属性方面做错了什么,或者这不是进行延迟初始化的正确方法吗?
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