我的C#属性何时初始化?

Eri*_*rix 0 c# getter initialization properties

关于我的房产何时被初始化,我有点困惑.

假设我有一个声明如下的属性:

private Dictionary<string, Dictionary<string,string>> MessageLookup
    {
        get
        {
           return messages ?? doSomething();
        }
    }
Run Code Online (Sandbox Code Playgroud)

doSomething方法填充消息Dictionary并返回它.

我的问题是,这段代码什么时候运行?如果我在doSomething代码中放置一个断点,它就不会被命中,但是当我在调试器中查看它时,MessageLookup属性正在保存数据(这是它被初始化的唯一地方).

这段代码是在构建时运行的吗?当我将鼠标悬停在变量名称上时,调试器会自动运行吗?如果是这样,为什么断点不会被击中?

Jon*_*eet 7

只要有人引用该属性,就会运行该代码,而不是之前.

如果您使用调试器,您将看到它,因为调试器尝试自动获取属性值(因此您可以看到对象的状态).我不知道调试器是否在为自己评估属性时忽略了断点 - 这可以解释所有内容.

尝试不在调试器中运行代码,并使一些代码访问您的属性:

var lookup = someObject.MessageLookup;
Run Code Online (Sandbox Code Playgroud)

使doSomething()转储成为堆栈跟踪,您将看到正在发生的事情.