为什么我的数组初始化代码会导致抛出StackOverflowException?

时间:2010-05-26 17:11:11

标签: c# arrays stack-overflow

我的类构造函数中的以下代码行抛出了StackOverflowException:

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

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


更新:原因在于设置者,我试图修剪所有值:

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

4 个答案:

答案 0 :(得分:8)

如果myList是一个属性,你是否检查了它的setter的主体没有递归地分配给它自己而不是支持字段,如:

private string[] _myList;

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

}

答案 1 :(得分:2)

myList = new string[0]

这应该创建一个包含0个元素的数组。

编辑:我刚测试new string[] {},它对我有用。也许你的stackoverflow的原因在其他地方。

你可以发布你方法的其余部分吗?一般来说,堆栈溢出特别是在执行大量递归方法调用时发生。像这样:

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

答案 2 :(得分: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,它将访问自身,然后访问自身等,导致无限递归和堆栈溢出。

答案 3 :(得分:1)

似乎@Jonas H所说的是准确的,你可能会递归地修改Property而不是它的支持字段。

<强> 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(); 
        } 
    }
}

从右

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