调试期间c#属性行为的延迟初始化

本文关键字:延迟 初始化 性行为 属性 调试 | 更新日期: 2023-09-27 18:09:53

当我试图延迟初始化一些数据时,我有不同的行为-在调试和不调试的情况下运行。在调试这段代码时,该属性似乎在被调用之前就得到了评估!在没有调试的情况下运行时,这种情况不会发生(某种竞争条件?)。

我在行B2和C2上有断点。澄清一下:我从来没有期望看到下面的行被打印出来,但是我在调试时看到了它。2: Checking hasvalue: True, 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

调试期间c#属性行为的延迟初始化

引用上面的评论作为答案-这样我就可以结束这个问题了

调试器假定getter没有副作用,因此如果您在监视列表中有它,它将对其进行评估。——@Cine