为什么我的数组初始化代码会导致抛出StackOverflowException?
的代码在我的类的构造函数下面的行抛出一个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();
}
}
如果myList中是一个属性,你检查它的制定者的身体不递归分配给本身,而不是支持字段的,如:
private string[] _myList;
public string[] myList {
get {
return _myList;
}
set {
_myList = value;
}
}
+1用于在这种特殊情况下识别问题。如果你写了正确的支持字段,这将是完美的。 – Simon 2010-05-26 17:21:11
myList = new string[0]
这应该与0个元素创建一个数组。
编辑:我刚刚测试new string[] {}
它适用于我。也许你的stackoverflow的原因是在别处。
你可以发表你的方法的其余部分?一般来说,当执行大量递归方法调用时,特别会发生stackoverflow。就像这样:
void MyMethod(int i)
{
MyMethod(i); //!StackOverFlow!
}
不,仍然得到StackOverflowException。 – MCS 2010-05-26 17:13:04
看起来好像@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();
}
}
}
你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
,它的访问本身,然后访问自己等,导致无限递归和堆栈溢出。
经过测试;我可以说这是最可能的原因,如果不是原因。 – BoltClock 2010-05-26 17:30:14
你能发布你的构造函数吗?看起来问题的真正原因可能在另一条线上。 – Syntactic 2010-05-26 17:17:04