我只是在 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; }
}
}
Run Code Online (Sandbox Code Playgroud)
这是我对属性所做的第一件事:)——你递归地调用 y 设置器而不是设置支持字段。由于它调用了自己,最终会出现stackoverflow。
每个 setter 都是语法糖,基本上是一个方法调用。您所做的基本上等同于使用方法执行此操作:
public class SomeClass
{
public string GetValue() { return "some string"; }
public void SetValue(string arg)
{
SetValue(arg); // recursively calls itself until stackoverflow
}
}
Run Code Online (Sandbox Code Playgroud)