0

我对我的属性何时被初始化有点困惑。

假设我有一个这样声明的属性:

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

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

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

这段代码是在施工时运行的吗?当我将鼠标悬停在变量名上时,调试器会自动运行它吗?如果是这样,为什么断点没有命中?

4

3 回答 3

7

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

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

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

var lookup = someObject.MessageLookup;

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

于 2009-08-03T19:53:34.990 回答
0

它在首次评估您的属性时运行。没有背景的东西。

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

于 2009-08-03T19:53:09.577 回答
0

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

于 2009-08-03T20:03:05.237 回答