3
public class Class1
    {
        public Class1()
        {
            prop = new Class2();
        }
        public Class2 prop { get; set; }

        public class Class2
        {
            public Class2()
            {
                this.prop2 = "nikola";
            }

            public string prop2 { get { return prop2; } set { prop2 = EditString(value); } }

            public string EditString(string str)
            {
                str += " plavsic";
                return str;
            }
        }
    }

这是我有问题的代码。当我尝试初始化 Class1 类型的对象时,它会引发 StackOverflowException 错误。我究竟做错了什么?

4

7 回答 7

9

您的财产正在自行设定。

属性设置器中的行prop2 = ...调用属性设置器,它再次调用自身,再次调用自身,再次调用自身,再次调用自身,再次调用自身,再次调用自身,再次调用自身,再次调用自身再次呼唤自己,再次呼唤自己,再次呼唤自己,再次呼唤自己,再次呼唤自己,再次呼唤自己,再次呼唤自己,再次呼唤自己,再次呼唤自己,再次呼唤自己,它再次调用自己...

getter 做同样的事情,只是你从不调用它。

您需要为要获取和设置的属性创建一个支持字段。

例如:

private string prop2; //Create a backing field
public string Prop2 {
    get { return prop2; }
    set { prop2 = EditString(value); }
}
于 2010-11-24T17:38:08.237 回答
4

Prop2 设置/返回 Prop2...,它调用 Prop2 来获取/设置 Prop2 的值,它调用 Prop2... 看看这将走向何方?

这种情况一直在发生,直到计算机/运行时耗尽存储调用堆栈的空间并死亡。

于 2010-11-24T17:39:02.590 回答
3

您在 get 中返回 prop2,这会导致堆栈溢出(无限递归是不好的)。

于 2010-11-24T17:38:17.267 回答
1

您处于无限循环中,因为您将属性 (prop2) 设置为自身。

于 2010-11-24T17:39:42.617 回答
1

错误在 的定义中prop2。get 和 set 方法都只是简单地回调prop2属性并因此引发无限递归。

public string prop2 { 
  get { return prop2; // <-- This just calls prop2 get again}
}

您需要在此处添加一个支持字段来存储属性的值,如下所示

private string m_prop2;
public string prop2 { 
  get { return m_prop2; } 
  set { m_prop2 = EditString(value); } } 
于 2010-11-24T17:41:30.763 回答
0

抛出异常时,您是否查看过调用堆栈?您应该看到对 prop2 的 setter 的无穷无尽的调用列表。

于 2010-11-24T17:40:38.143 回答
0

您正在将属性设置为自身

于 2010-11-24T18:30:58.767 回答