什么时候我的C#属性初始化?
问题描述:
我有点困惑,什么时候我的财产正在被初始化。什么时候我的C#属性初始化?
假设我有声明如下属性:
private Dictionary<string, Dictionary<string,string>> MessageLookup
{
get
{
return messages ?? doSomething();
}
}
的DoSomething的方法填充消息字典并返回。
我的问题是,这段代码何时运行? 如果我在doSomething代码中放置了一个断点,它不会被命中,但是当我在调试器中查看它时,MessageLookup属性保存着数据(这是它初始化的唯一位置)。
此代码是否在施工时运行?当我将鼠标悬停在变量名称上时,调试器会自动运行它吗?如果是这样,为什么不是断点?
答
只要任何人引用该属性,而不是之前运行该代码。
如果您使用调试器,您会看到它,因为调试器会尝试自动获取属性值(以便您可以看到对象的状态)。我不知道调试器是否在为自己评估属性时忽略断点 - 这可以解释所有事情。
尝试运行代码在调试器不,并提出一些代码访问你的财产:
var lookup = someObject.MessageLookup;
让doSomething()
转储堆栈跟踪,你会看到发生了什么事情。
答
它是在您的房产首次评估时运行。没有背景的东西在继续。
我猜你没有看到这个,因为你使用Quickwatch来检查你的对象。那时它会被执行并且你的断点将被跳过。
答
属性获取者(和ToString()
就此而言)假定为pure,这基本上意味着评估它没有副作用。您应该重写代码以遵守该假设,否则您将面临nasty consequences。如果在访问时必须使用延迟初始化,请改用GetMessageLookup()
方法。
你可以发表一些doSomething方法的内容吗? – Zyphrax 2009-08-03 19:54:15
在`返回消息中放置一个断点? doSomething()`没有运行你的项目,然后运行它。 – 2009-08-03 19:54:59