我对我的房产何时被初始化感到有点困惑。
假设我有一个声明如下的属性:
private Dictionary<string, Dictionary<string,string>> MessageLookup
{
get
{
return messages ?? doSomething();
}
}
doSomething方法填充消息Dictionary并返回它。
我的问题是,此代码何时运行? 如果我在doSomething代码中放置一个断点,它就不会被命中,但是当我在调试器中查看它时,MessageLookup属性正在保存数据(这是它被初始化的唯一地方)。
此代码是否在构建时运行?当我将鼠标悬停在变量名称上时,调试器会自动运行吗?如果是这样,为什么断点不会被击中?
答案 0 :(得分:7)
只要有人引用该属性,就会运行该代码,而不是之前。
如果使用调试器,您将看到它,因为调试器会尝试自动获取属性值(因此您可以看到对象的状态)。我不知道调试器在评估自身属性时是否忽略了断点 - 这可以解释所有内容。
尝试在调试器中运行代码而不是,并使一些代码访问您的属性:
var lookup = someObject.MessageLookup;
让doSomething()
转储堆栈跟踪,你会看到发生了什么。
答案 1 :(得分:0)
首次评估您的媒体资源时会运行它。没有背景资料。
我猜你没有看到这个因为你使用Quickwatch检查你的对象。此时它将被执行并且您的断点将被跳过。
答案 2 :(得分:0)
属性getter(以及ToString()
)假定为pure,这基本上意味着评估它没有副作用。您应该重写代码以遵守该假设,否则您将面临nasty consequences。如果必须在访问时使用延迟初始化,请改用GetMessageLookup()
方法。