2012-02-10 4 views
3

저는 항상이 문제에 대해 혼란스러워합니다. 다음 루프를 고려.NET 루프 무결성 101

int [] list = new int [] { 1, 2, 3 }; 
for (int i=0; i < list.Length; i++) { } 
foreach (int i in list) { } 
while (list.GetEnumerator().MoveNext()) { } // Yes, yes you wouldn't call GetEnumerator with the while. Actually never tried that. 
  • [리스트는 상술 한 하드 코딩된다. 루프가 반복되는 동안 외부에서 목록이 변경된 경우 어떻게됩니까?
  • [list]가 읽기 전용 속성 인 경우 어떻게됩니까? int List{get{return(new int [] {1,2,3});}}? 이것은 루프를 뒤엎을 것입니까? 그렇지 않은 경우 각 반복에서 새 인스턴스를 만듭니다.

답변

6

좋고, 각각의 반복에 대해 list.Length

  • for 루프 검사; 루프 내에서 실제로 list에 액세스하지 않으므로 내용이 변경되지 않습니다.
  • foreach 루프는 list을 사용하여 반복기를 가져옵니다. 다른 목록을 참조하도록 변경하면 아무런 차이가 없지만 목록 자체를 구조적으로 수정 한 경우 (예 : 대신 실제로 List<int> 인 경우 값을 추가하면 반복기가 무효화됩니다)
  • 세 번째 매번 새로운 반복자를 얻는다면, 목록이 지워지지 않는 한, 예제는 계속해서 쓸 것입니다. 좀 더 합리적인 설명을 원하는 경우를 말한다

은 기본적으로 당신이 개체 변수 변화 대 배열의 내용의 차이를 이해할 필요가 분별 코드를 게시 - 다음 우리에게 매우 콘크리트 상황을 제공 설명하기. 그러나 일반적으로 foreach 루프는 반복자를 가져올 때 소스 표현식에 한 번만 직접 닿습니다. 반면 for 루프에는 마술이 없으며 액세스되는 빈도는 코드에 따라 달라집니다 (조건과 "단계" for 루프의 일부가 각 반복에서 실행되므로 해당 부분에서 변수를 참조하면 변경 사항이 표시됩니다.

+1

또 다른 요점은 배열의 경우 'Length' 속성은 다음과 같습니다. 불변. 배열에서'Length'를 호출하고 특정 값을 얻는다면, 그 배열에 대한 앞으로의 모든 호출은 동일한 값을 반환하도록 보장됩니다. 물론 인스턴스 변수가 배열 타입이고 다른 인스턴스를 가리 키도록 인스턴스 변수를 변경하면 배열의 길이가 이전 배열과 다를 수 있습니다. – supercat