2011-08-15 133 views
1

堆棧溢出異常是在此屬性的setter方法拋出:爲什麼這個簡單的代碼會導致堆棧溢出異常?

public string TimeZone 
{ 
    get 
    { 
     if (TimeZone == null) 
      return ""; 

     return TimeZone; 
    } 
    set { TimeZone = value; } 
} 

「類型‘System.StackOverflowException’未處理的異常發生」

我看不出有任何直接的遞歸這裏。

如果代碼有問題,我應該用什麼來改正它?

+0

正如jgauffin所述,當您調用return TimeZone時,實際發生的是您再次調用TimeZone屬性。所以它進入一個無限循環,一直稱它爲自我。 – Jethro

回答

11
set { TimeZone = value; } 

setter是遞歸的。

您必須使用一個字段,如:

string _timeZone; 

public string TimeZone 
{ 
    get 
    { 
     if (_timeZone== null) 
      return ""; 

     return _timeZone; 
    } 
    set { _timeZone= value; } 
} 
+2

'get'也是遞歸的。 –

+1

是的(我在代碼示例中也改變了它),但是我回答了問爲什麼*** setter ***正在生成堆棧溢出的問題。 – jgauffin

1

試試這個

public string TimeZone 
    { 
     get 
     { 
      if (m_TimeZone == null) 
       return ""; 

      return m_TimeZone; 
     } 
     set {m_TimeZone = value; } 
    } 

m_TimeZone應與之關聯的可變

您正在訪問的內部屬性TimeZone相同的屬性TimeZone,你應該是訪問和使用相關變量

1

在你ARA訪問吸氣劑本身的吸氣,這造成財產遞歸調用吸氣劑本身

if (TimeZone == null) 

二傳手遞歸以及

set { TimeZone = value; } 

所以取決於調用代碼任何的getter或setter導致堆棧由於多次調用屬性導致溢出(引擎蓋下方法爲get_TimeZone()/set_TimeZone())。

因此,引入支持領域和使用它的財產,這是一個commo技術,我想知道爲什麼你不知道這樣簡單的東西。

4

getset都是通過再次調用自己遞歸的。試試這個:

string timeZone; 

public string TimeZone 
{ 
    get { return timeZone == null ? string.Empty : timeZone; } 
    set { timeZone = value; } 
} 
相關問題