Почему мой код инициализации массива вызывает исключение StackOverflowException? - PullRequest
1 голос
/ 26 мая 2010

Следующая строка кода в конструкторе моего класса вызывает исключение 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 ]

8 голосов
/ 26 мая 2010

Если myList является свойством, вы проверяли, что тело его установщика не рекурсивно присваивает себе вместо поля поддержки, как в:

private string[] _myList;

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

}

2 голосов
/ 26 мая 2010

Ваш код 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, он обращается к самому себе, который затем обращается к себе и т. Д., Что приводит к бесконечной рекурсии и переполнению стека.

2 голосов
/ 26 мая 2010
myList = new string[0]

Это должно создать массив с 0 элементами.

РЕДАКТИРОВАТЬ: Я только что проверил new string[] {}, и это работает для меня Возможно, причина вашего стекопотока в другом месте.

Можете ли вы опубликовать остальную часть вашего метода? Обычно говорят, что переполнение стека происходит при выполнении рекурсивных вызовов большого числа методов. Как это:

void MyMethod(int i)
{
   MyMethod(i); //!StackOverFlow!
}
1 голос
/ 26 мая 2010

Кажется, что то, что @Jonas H сказал правильно, возможно, вы рекурсивно изменяете Свойство вместо его поля поддержки.

НЕВЕРНО

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