-2

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

}

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

4

6 回答 6

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; }
    }
    

顺便说一句:请注意我如何将属性名称更改为以大写字母开头。这是 C# 中公共成员的公认标准。

于 2013-02-21T08:45:35.263 回答
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;
    }
}
于 2013-02-21T08:46:24.680 回答
1

尝试这个 :

public string forfattareEfternamn
{
    get;
    set;
}

public int lanseringsDatum
{
    get;
    set;
}
于 2013-02-21T08:47:50.193 回答
1

您的两个 get 语句都引用了自己。每当您尝试检索任一属性时,它都会一遍又一遍地调用自己的 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; }
}

或者,如果您在属性中不需要额外的代码,那么空白的 get/set 对您来说就可以了。

public string ForfattareEfternamn
{
    get;
    set;
}

public int LanseringsDatum
{
    get;
    set;
}

(同样在你的二传手中,你有一个额外的;)

于 2013-02-21T08:49:31.273 回答
1

您正在从 getter 调用属性,后者调用属性等等。

public string forfattareEfternamn
{
    get {return forfattareEfternamn;} <-- here you call property getter again
    set {forfattareEfternamn = value;} 
}

如果要使用后备存储,则字段和属性应具有不同的名称(通常为后备存储的驼峰式名称和属性的 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)

于 2013-02-21T08:45:46.420 回答
1
 public string forfattareEfternamn
    {
        get; 
        set;
    }

    public int lanseringsDatum
    {
        get;
        set;
    }

我相信自动属性是你想要做的。

于 2013-02-21T08:46:55.150 回答