2010-11-24 22 views
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错误。我究竟做错了什么?我得到StackOverflowException错误在我的嵌套类属性C的集合函数#

+0

您是否尝试过使用调试步骤虽然呢? SO通常是通过递归调用某些东西引起的 - 逐步执行代码会立即向您显示重复的内容。 – SqlRyan 2010-11-24 17:38:37

+0

谢谢大家,你一直在帮助... – 2010-11-24 17:46:42

回答

4

Prop2设置/返回Prop2 ...它调用Prop2来获取/设置Prop2的值,它调用Prop2 ...看看它在哪里?

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

9

您的物业正在设置。

属性设置程序中的行prop2 = ...调用属性设置程序,该设置程序再次调用自身,再次调用自身,再次调用自身,再次自己调用自己,再次自我调用自己,再次调用自身,再次调用自身,再次调用自己,再次调用自己,再次调用自己,再次调用自己,再次调用自己,再次调用自己,再次调用自己,再次调用自己,再次调用自己,再次调用自己,再次自我调用自己。 ,它自己再次调用自己,再次调用自己...

除了你永远不会调用它,getter也会做同样的事情。

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

例如:

private string prop2; //Create a backing field 
public string Prop2 { 
    get { return prop2; } 
    set { prop2 = EditString(value); } 
} 
3

您在get返回PROP2,导致堆栈溢出(无限递归是坏的)。

1

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

0

当抛出异常时,你看过调用堆栈吗?你应该看到prop2调用者的无尽列表。

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

要设置的属性本身