2009-08-03 83 views
0

我有點困惑,什麼時候我的財產正在被初始化。什麼時候我的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

回答

7

只要任何人引用該屬性,而不是之前運行該代碼。

如果您使用調試器,您會看到它,因爲調試器會嘗試自動獲取屬性值(以便您可以看到對象的狀態)。我不知道調試器是否在爲自己評估屬性時忽略斷點 - 這可以解釋所有事情。

嘗試運行代碼在調試器不,並提出一些代碼訪問你的財產:

var lookup = someObject.MessageLookup; 

doSomething()轉儲堆棧跟蹤,你會看到發生了什麼事情。

0

它是在您的房產首次評估時運行。沒有背景的東西在繼續。

我猜你沒有看到這個,因爲你使用Quickwatch來檢查你的對象。那時它會被執行並且你的斷點將被跳過。

0

屬性獲取者(和ToString()就此而言)假定爲pure,這基本上意味着評估它沒有副作用。您應該重寫代碼以遵守該假設,否則您將面臨nasty consequences。如果在訪問時必須使用延遲初始化,請改用GetMessageLookup()方法。