2010-04-18 87 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