我的通用列表代码中的Stackoverflowexception错误,c#

时间:2013-02-21 08:44:18

标签: c#

我每次尝试运行代码时都会收到错误:“由于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; }
    }

}

有人可以帮我解决这个问题吗?

6 个答案:

答案 0 :(得分:3)

这里有一个简单无穷的递归。

您的两个属性都在访问自己。

有两种方法可以解决它:

  1. 自动属性:

    public string ForfattareEfternamn
    {
        get; set;
    }
    
    public int LanseringsDatum
    {
        get; set;
    }
    
  2. 支持字段:

    private string _forfattareEfternamn;
    private int _lanseringsDatum;
    
    public string ForfattareEfternamn
    {
        get { return _forfattareEfternamn; }
        set { _forfattareEfternamn = value; } 
    }
    
    public int LanseringsDatum
    {
        get { return _lanseringsDatum; }
        set { _lanseringsDatum = value; }
    }
    
  3. 顺便说一句:请注意我如何更改属性的名称以大写字母开头。这是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; }

强烈建议您阅读Properties (C# Programming Guide)

答案 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中;)