我的类构造函数中的以下代码行抛出了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();
}
}
答案 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();
}
}
}