2010-01-12 17 views
3

我正在使用.net 3.5。 我有一個類「A」有一個堆棧和一個getter屬性,當被調用時,刪除堆棧中的第一個項目,並檢索下一個。Getter屬性運行時沒有任何人調用它

初始化下課後,我看到的getter作品,未經被稱爲,並在棧中刪除頂部的項目,從而使我壞的結果。吸氣劑中的斷點沒有顯示任何人通過它。

當我的屬性更改爲一個函數,堆棧返回OK。

如果有人能解釋爲什麼,我會很高興。

這裏是簡化類:

public class A 
    { 
     private Stack<string> Urls; 

     public A(string title, string[] array) 
     { 
      Urls = new Stack<string>(); 
      foreach (string s in array) 
      { 
       Urls.Push(s); 
      } 
     } 

     public string Url 
     { 
      get { return Urls.Peek(); } 
     } 
     public string NextUrl 
     { 
      get{ 
      if (Urls.Count > 1) 
       { Urls.Pop(); } 
      return Urls.Peek(); 
      }; 
     }    
    } 

回答

9

首先,使屬性訪問更改狀態通常是一個壞主意。最應該做的是懶惰地初始化一些東西 - 或者可能給出一個不穩定的值(如DateTime.Now)。

其次,你可能會看到這一點,如果你正在調試器下運行 - 當你通過代碼加強其訪問性能。這也許可以解釋爲什麼斷點也沒有被擊中。

+0

謝謝喬恩。我很榮幸。 :) – Nir 2010-01-12 12:37:00

2
Urls.Pop(); 

想成爲

return Urls.Pop(); 

,因爲它在同一時間返回值從列表中刪除


實際上,重新讀取您的問題,看起來像是因爲調試器會評估屬性。如果你在沒有調試器的情況下運行應用程序,你會得到同樣的問題嗎?

+0

是的,重新閱讀,我想你是對的。刪除我的答案和期待「紀律」徽章:-) +1 – balpha 2010-01-12 12:29:46

+0

沒有嘗試過外部調試器,但我幾乎100%確定你是對的。謝謝。 – Nir 2010-01-12 12:43:09

1

這是我認爲不好的設計。 get訪問器不應以在後續調用中導致不同結果的方式改變對象。

+0

謝謝。現在我知道了。 :) – Nir 2010-01-12 12:30:44

1

IMO,這裏具有具有非顯而易見的副作用的特性的問題;這應該是一個方法:

public string GetNextUrl() { /* */ } 

否則不好的事情發生無處不在(調試器,數據綁定等)。不要認爲有人只讀了一次財產。

在性能的唯一明智使用的副作用是一樣的東西延遲加載,初始化延遲等,這還是應報告相同的值時,沒有任何其他明顯的變異電話叫順序。

+0

謝謝,馬克。我很感激。 – Nir 2010-01-12 12:31:27

相關問題