我刚刚在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; }
}
}
答案 0 :(得分:4)
这是我用属性做的第一件事:) - 你递归调用y setter而不是设置一个支持字段。因为它自称,它最终将stackoverflow。
每个setter都是语法糖,基本上是一个方法调用。你所做的基本上等同于用一种方法做到这一点:
public class SomeClass
{
public string GetValue() { return "some string"; }
public void SetValue(string arg)
{
SetValue(arg); // recursively calls itself until stackoverflow
}
}
答案 1 :(得分:1)
您在setter中写了y = value;
而不是x = value;
!
请注意,对于简单属性,您可以使用
public string y { get; set; }
会自动生成隐藏字段。