【问题标题】:Stackoverflowexception error in my generic list code, c# [duplicate]我的通用列表代码中的 Stackoverflowexception 错误,c# [重复]
【发布时间】:2013-02-21 17:06:50
【问题描述】:

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

}

谁能帮我解决这个问题?

【问题讨论】:

    标签: c#


    【解决方案1】:

    你在这里有一个简单的、无限的递归。

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

    有两种修复方法:

    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# 中公共成员的公认标准。

    【讨论】:

    • 完美,非常感谢!!
    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案3】:
       public string forfattareEfternamn
          {
              get; 
              set;
          }
      
          public int lanseringsDatum
          {
              get;
              set;
          }
      

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

      【讨论】:

        【解决方案4】:

        试试这个:

        public string forfattareEfternamn
        {
            get;
            set;
        }
        
        public int lanseringsDatum
        {
            get;
            set;
        }
        

        【讨论】:

          【解决方案5】:

          您的两个 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;
          }
          

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

          【讨论】:

            【解决方案6】:

            你正在从 getter 调用属性,它调用属性等等。

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

            如果你想使用后置存储,那么字段和属性应该有不同的名称(通常是后置存储的驼峰命名,属性的帕斯卡命名):

            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)

            【讨论】:

            • 所以例如,而不是这个: public string forfattareFornamn { get {return forfattareFornamn;} set {forfattareFornamn = value;} }
            • 我应该写: public string ForfattareFornamn { get {return forfattareFornamn;} set {forfattareFornamn = value;} }
            • @user2057693 只需写成public string ForfattareEfternamn { get; set; },因为您的属性中没有任何逻辑
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多