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

时间:2009-08-03 19:50:04

标签: c# properties initialization getter

我对我的房产何时被初始化感到有点困惑。

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

private Dictionary<string, Dictionary<string,string>> MessageLookup
    {
        get
        {
           return messages ?? doSomething();
        }
    }

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

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

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

3 个答案:

答案 0 :(得分:7)

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

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

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

var lookup = someObject.MessageLookup;

doSomething()转储堆栈跟踪,你会看到发生了什么。

答案 1 :(得分:0)

首次评估您的媒体资源时会运行它。没有背景资料。

我猜你没有看到这个因为你使用Quickwatch检查你的对象。此时它将被执行并且您的断点将被跳过。

答案 2 :(得分:0)

属性getter(以及ToString())假定为pure,这基本上意味着评估它没有副作用。您应该重写代码以遵守该假设,否则您将面临nasty consequences。如果必须在访问时使用延迟初始化,请改用GetMessageLookup()方法。