我每次尝试运行代码时都会收到错误:“由于StackOverFlowException导致进程终止”。当我看到警告时,我会在我的专长上说“确保你没有无限循环或无限递归”。这是我的代码:
class Book
{
public string bokensTittle
{
get { return bokensTittle; }
set { bokensTittle = value; }
}
public string forfattareFornamn
{
get {return forfattareFornamn;}
set {forfattareFornamn = value;} // on this line i get the error
}
public string forfattareEfternamn
{
get {return forfattareEfternamn;}
set {forfattareEfternamn = value;;}
}
public int lanseringsDatum
{
get { return lanseringsDatum; }
set { lanseringsDatum = value; }
}
}
有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
这里有一个简单无穷的递归。
您的两个属性都在访问自己。
有两种方法可以解决它:
自动属性:
public string ForfattareEfternamn
{
get; set;
}
public int LanseringsDatum
{
get; set;
}
支持字段:
private string _forfattareEfternamn;
private int _lanseringsDatum;
public string ForfattareEfternamn
{
get { return _forfattareEfternamn; }
set { _forfattareEfternamn = value; }
}
public int LanseringsDatum
{
get { return _lanseringsDatum; }
set { _lanseringsDatum = value; }
}
顺便说一句:请注意我如何更改属性的名称以大写字母开头。这是C#中公共成员的公认标准。
答案 1 :(得分:2)
您的属性名称与您在getter和setter中使用的名称相匹配。声明只有get; set;如果您不打算使用私有变量,则使用语句。
class Book
{
public string bokensTittle
{
get;set;
}
public string forfattareFornamn
{
get;set;
}
public string forfattareEfternamn
{
get;set;
}
public int lanseringsDatum
{
get;set;
}
}
答案 2 :(得分:1)
您正在从getter调用属性,调用属性等等。
public string forfattareEfternamn
{
get {return forfattareEfternamn;} <-- here you call property getter again
set {forfattareEfternamn = value;}
}
如果要使用后备存储,则字段和属性应具有不同的名称(通常用于后备存储的camelCase名称和属性的PascalCase名称):
private string forfattareEfternamn; // field for storing property value
public string ForfattareEfternamn // property
{
get {return forfattareEfternamn;} // returning field value
set {forfattareEfternamn = value;} // setting field value
}
但在您的情况下,您可以简单地使用自动实现的属性:
public string ForfattareEfternamn { get; set; }
答案 3 :(得分:1)
public string forfattareEfternamn
{
get;
set;
}
public int lanseringsDatum
{
get;
set;
}
我相信autoproperties是你想要做的。
答案 4 :(得分:1)
试试这个:
public string forfattareEfternamn
{
get;
set;
}
public int lanseringsDatum
{
get;
set;
}
答案 5 :(得分:1)
你的两个get语句都引用自己。每当你试图检索任何一个属性时,它都会调用它自己的一遍又一遍。这是无限循环和堆栈溢出的原因。
相反,您可以使用支持字段。
private string _forfattareEfternamn;
private int _lanseringsDatum;
public string ForfattareEfternamn
{
get {return forfattareEfternamn;}
set {forfattareEfternamn = value;;}
}
public int LanseringsDatum
{
get { return lanseringsDatum; }
set { lanseringsDatum = value; }
}
或者,如果属性中不需要其他代码,则空白获取/设置将适用于您。
public string ForfattareEfternamn
{
get;
set;
}
public int LanseringsDatum
{
get;
set;
}
(另外在你的第一个你有一个额外的setter中;)