什么时候我的C#属性初始化?

问题描述:

我有点困惑,什么时候我的财产正在被初始化。什么时候我的C#属性初始化?

假设我有声明如下属性:

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

的DoSomething的方法填充消息字典并返回。

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

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

+0

你可以发表一些doSomething方法的内容吗? – Zyphrax 2009-08-03 19:54:15

+0

在`返回消息中放置一个断点? doSomething()`没有运行你的项目,然后运行它。 – 2009-08-03 19:54:59

只要任何人引用该属性,而不是之前运行该代码。

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

尝试运行代码在调试器不,并提出一些代码访问你的财产:

var lookup = someObject.MessageLookup; 

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

它是在您的房产首次评估时运行。没有背景的东西在继续。

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

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