2010-05-26 3 views
1
내 클래스 생성자에 다음의 코드가있는 StackOverflowException 던지고

: 왜 무슨 일이 일어나고 있음을배열 초기화 코드로 인해 StackOverflowException이 발생하는 이유는 무엇입니까?

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

를? 빈 배열을 초기화하는 적절한 방법은 무엇입니까?


UPDATE : 원인은 I 모든 값을 정돈하려고시킨 세터에서 :이 0 요소 배열을 생성한다

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

생성자 전체를 게시 할 수 있습니까? 문제의 실제 원인은 다른 선상에있는 것 같습니다. – Syntactic

답변

8

, 당신은 같이 세터의 몸이 반복적으로 백업 필드 대신 자체에 할당하지 않는 것을 확인 않았다

private string[] _myList; 

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

}

+1

+1이 특별한 경우에 문제를 인식합니다. 뒷받침 필드를 올바르게 사용했다면 완벽 할 것입니다. – Simon

2
myList = new string[0] 

.

편집 : 방금 new string[] {}을 테스트했으며 제대로 작동합니다. 어쩌면 당신의 stackoverflow에 대한 이유는 다른 곳에있을 것이다.

나머지 방법을 게시 할 수 있습니까? 일반적으로 말하면 스택 오버 플로우는 높은 재귀 적 메서드 호출을 수행 할 때 특별히 발생합니다. 이처럼 : myList에이 속성 인 경우

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

아니, 아직도 StackOverflowException지고. – MCS

1

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

관련 문제