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}}
}
我一直在 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}}
}