C# 中的用户定义属性在构造时导致 StackOverflowException

User defined properties in C# cause StackOverflowException on construction

我一直在 Unity3d 引擎中编写一些代码,并且一直在自学 C#。我一直在努力寻找我的问题的答案,但无济于事。我来自 java 并且一直在尝试使用属性,但恐怕我不太了解它们。当我尝试这样的事情时:

public int Property
{
    get
    {
        return Property;
    }

    set
    {
        Property = value;
    }
}

当访问 属性 进行赋值时,我得到一个堆栈溢出来初始化对象。我可以通过使用默认的 属性 样式来修复它:

get;
set;

但我不知道导致异常的第一个实例是怎么回事。如果有人能帮忙解释一下就太好了。

您需要一个支持字段。

当你设置 属性 时,它会自行设置,它会自行设置,它会自行设置,它会自行设置,它会......你明白了要点。

或者:

private int _Property;
public int Property
{
    get
    {
        return _Property;
    }

    set
    {
        _Property = value;
    }
}

或者这个:

public int Property
{
    get;
    set;
}

后一种形式称为自动 属性,它会为您创建支持字段,因此实际上这两个将创建几乎相同的代码(支持字段的名称会有所不同)。


当您在您的代码版本中执行此操作时:

x.Property = 10;

你最终 属性 做了完全相同的事情,因此你得到了堆栈溢出。您可以将其重写为具有相同问题的方法,如下所示:

public void SetProperty(int value)
{
    SetProperty(value);
}

由于完全相同的原因,此工具将导致堆栈溢出异常。

此外请记住,当您创建这样的 属性 时

public class Example
{
   public String MyData{ get; set;}
}

实际上当你编译它时,编译器将它翻译成这样:

public class Example
{
   private String _myData;
   public String MyData{ get {return _myData}; set { _myData = value}}
}