2009-09-17 20 views
4

我不確定當我嘗試覆蓋get和set函數時,是什麼導致了StackOverflowException。當我只使用默認獲取並設置它的作品。重載Getter和Setter在C中導致StackOverflow#

enum MyEnumType 
{ 
.... 
} 

public MyEnumType data { get; set; } 

但是當我嘗試添加額外的數據,它拋出一個StackOverflowException

public MyEnumType data 
{ 
    get 
    { 
    return data; 
    } 
    set 
    { 
    data = value; 
    } 
} 

任何想法?當我爲asp.net用戶控件屬性執行此操作時,沒有任何問題。我想知道爲什麼它導致正常的枚舉數據類型的StackOverflowException。

+4

您遞歸調用您的公共getter(在getter中)!這就是你得到堆棧溢出的原因。 – bleeeah 2009-09-17 09:58:47

回答

25

是的,你沒有背場......這是你應該怎麼做:

private MyEnumType data; 

public MyEnumType Data 
{ 
    get 
    { 
    return data; 
    } 
    set 
    { 
    data = value; 
    } 
} 

什麼情況是,你是指財產爲了返回自己,這會導致無限循環嘗試訪問自己的價值。因此,StackOverFlow。

在您的情況下,當您不在get和set方法中添加任何其他邏輯時,您也可以使用自動屬性。這是簡單的定義如下所示:

public MyEnumType Data 
{ 
    get; 
    set; 
} 
+6

對於那些不知道的人來說,C#將屬性作爲兩個獨立的**函數**來實現。因此,每次調用setter或getter時都會引入另一個堆棧層,最終導致堆棧溢出。 – 2009-09-17 10:00:53

+0

這是正確的,謝謝澄清馬修。 – Robban 2009-09-17 10:03:35

6

你在你的getter和setter中引用屬性本身,導致無限遞歸(堆棧溢出)。如果你使用了標準的命名約定(Data),那將會更加明顯。
試着這麼做:

private MyEnumType _data; 

public MyEnumType Data 
{ 
    get { return _data; } 
    set { _data = value; } 
} 
3
public class MyClass 
{ 
    string propertyString; 

    public string MyPropertyString 
    { 
     get 
     { 
      return propertyString; 
     } 
     set 
     { 
      propertyString = value; 
     } 
    } 
} 

的屬性名稱必須是從成員名稱不同。

0

在setter/getter內部放置一個斷點並進行調試,確保您使用step(F11)不會超越 - 這應該有助於解釋發生了什麼。