2010-05-26 71 views
1

的代码在我的类的构造函数下面的行抛出一个StackOverflowException:为什么我的数组初始化代码会导致抛出StackOverflowException?

myList = new string[]{}; // myList is a property of type string[] 

这是为什么发生?什么是初始化空数组的正确方法?


UPDATE:的原因是在设定器,其中我试图将修剪的所有值:

set 
{ 
    for (int i = 0; i < myList.Length; i++) 
    { 
     if (myList[i] != null) myList[i] = myList[i].Trim(); 
    } 
} 
+0

你能发布你的构造函数吗?看起来问题的真正原因可能在另一条线上。 – Syntactic 2010-05-26 17:17:04

回答

8

如果myList中是一个属性,你检查它的制定者的身体不递归分配给本身,而不是支持字段的,如:

private string[] _myList; 

public string[] myList { 
    get { 
    return _myList; 
    } 
    set { 
    _myList = value; 
    } 

}

+1

+1用于在这种特殊情况下识别问题。如果你写了正确的支持字段,这将是完美的。 – Simon 2010-05-26 17:21:11

2
myList = new string[0] 

这应该与0个元素创建一个数组。

编辑:我刚刚测试new string[] {}它适用于我。也许你的stackoverflow的原因是在别处。

你可以发表你的方法的其余部分?一般来说,当执行大量递归方法调用时,特别会发生stackoverflow。就像这样:

void MyMethod(int i) 
{ 
    MyMethod(i); //!StackOverFlow! 
} 
+0

不,仍然得到StackOverflowException。 – MCS 2010-05-26 17:13:04

1

看起来好像@Jonas H说的是准确的,你可能会递归地修改属性而不是它的后台字段。

WRONG

private String[] _myList; 
public String[] myList 
{ 
    get {return _myList;} 
    set 
    { 
     for (int i = 0; i < myList.Length; i++) 
     { 
      if (myList[i] != null) myList[i] = myList[i].Trim(); 
     } 
    } 
} 

RIGHT

private String[] _myList; 
public String[] myList 
{ 
    get {return _myList;} 
    set 
    { 
     for (int i = 0; i < _myList.Length; i++) 
     { 
      if (_myList[i] != null) _myList[i] = _myList[i].Trim(); 
     } 
    } 
} 
2

set代码实际上并没有分配任何东西,是指本身。我有一种感觉,你误解了属性的工作原理。您需要该财产操纵后备变量:

private string[] _myList; 

然后你需要让你与该变量set代码工作:

public string[] myList 
{ 
    get 
    { 
     return _myList; 
    } 

    set 
    { 
     _myList = value; // you have to assign it manually 
     for (int i = 0; i < _myList.Length; i++) 
     { 
      if (_myList[i] != null) _myList[i] = _myList[i].Trim(); 
     } 
    } 
} 

如果您尝试访问myList,它的访问本身,然后访问自己等,导致无限递归和堆栈溢出。

+0

经过测试;我可以说这是最可能的原因,如果不是原因。 – BoltClock 2010-05-26 17:30:14

相关问题