2010-04-18 81 views
1

我剛剛在LINQPad中玩弄了一些代碼,並設法使程序崩潰並出現一個stackoverflow異常。從公共實例屬性返回靜態屬性的值

我基本上在字段中創建了一個靜態屬性,並使用一個屬性來返回實例的值。

我的實例屬性的getter會返回靜態字段的值,但setter會自己設置。什麼時候會使用這種類型的模式,以及如何產生一個stackoverflow異常?我所做的

代碼示例:

void Main() 
{ 
    SomeClass myinstance = new SomeClass(); 
    SomeClass.x = "Some Value"; 
    myinstance.y = "Some other value"; 
    myinstance.y.Dump(); 
} 

public class SomeClass 
{ 
    public static string x; 

    public string y 
    { 
     get { return x; } 
     set { y = value; } 
    } 
} 

回答

4

這是我曾經與性能:)做的第一件事 - 你遞歸調用在y制定者,而不是設置支持字段。由於它自己調用,它最終會疊加。

每個setter都是語法糖,基本上是一個方法調用。你所做的,基本上相當於一個方法,這樣做:

public class SomeClass 
{ 
    public string GetValue() { return "some string"; } 
    public void SetValue(string arg) 
    { 
     SetValue(arg); // recursively calls itself until stackoverflow 
    } 
} 
+0

哦,是的!謝謝馬克。什麼菜鳥的錯誤:P – 2010-04-18 19:08:38

+0

容易讓人......我敢肯定很多人都這樣做:) – 2010-04-18 19:10:02

1

你寫y = value;,而不是在二傳手x = value;

注意,對於簡單的屬性,你可以使用

public string y { get; set; } 

,它會自動生成一個隱藏字段。

+0

謝謝丹維爾。我沒有爲此使用自動屬性,因爲我正在測試從非靜態屬性返回靜態字段的值時發生了什麼。 :) – 2010-04-18 19:19:17

+0

我看到了,所以我的回答不知何故誤導了:) – Danvil 2010-04-18 20:00:45