2010-06-18 3 views
2

나는 범위를 상당히 자주 제한한다는 것을 알았다. 코드가 훨씬 명확 해져서 변수를 훨씬 더 쉽게 재사용 할 수 있습니다. 변수가 새로운 범위의 시작 부분에서 선언되어야하는 C에서 특히 유용합니다.더 엄격한 범위 지정이 더 자주 표시되지 않는 이유는 무엇입니까?

다음은 내가 말하는 의미의 예입니다.

{ 
     int h = 0; 
     foreach (var item in photos) 
     { 
      buffer = t.NewRow(); 
      h = item.IndexOf("\\x\\"); 
      buffer["name"] = item.Substring(h, item.Length - h); 
      t.Rows.Add(buffer); 
     } 
} 

이 예제에서는 모든 반복에서 초기화하지 않고 h의 범위를 제한했습니다.

하지만이 작업을 자주하는 많은 개발자는 보이지 않습니다. 왜 그런가요? 이 일에 단점이 있습니까?

+4

"이것은 변수가 새로운 범위의 시작 부분에서 선언되어야하는 C에서 특히 편리합니다." C99는 10 년 넘게 나왔습니다. –

+0

@Matthew : 불행히도 저는 MSVC에서 C 언어로 작동하기도하고 C 언어의 문장과 혼합 된 선언을 지원하지 않는다는 사실은 진정한 자극입니다 . –

+2

예, Microsoft는 최신 C 표준을 지원할 의사가 없음을 분명히 밝혔습니다 (http://connect.microsoft.com/VisualStudio/feedback/details/485416/support-c99). 그러나 사람들이 표준 및 많은 컴파일러 (GCC, clang, icc 등)를 인식하는 것이 중요합니다.)이 기능을 제공합니다. –

답변

5

음,이 경우는 "이전"값을 사용하지 않고, 모든 반복 어쨌든에 새로운 값을 할당하고 - 그래서 사용하십시오 :

foreach (var item in photos) 
{ 
    buffer = t.NewRow(); 
    int h = item.IndexOf("\\x\\"); 
    buffer["name"] = item.Substring(h, item.Length - h); 
    t.Rows.Add(buffer); 
} 

내가 찾을 것을 나는 할 경우 (범위 내에서, 물론) 공격적으로 나는 범위 지정 문제의 방식을 많이 가지지 않습니다. 만약 내가 그렇게한다면, 방법이 너무 길어서 어쨌든 그것을 리팩터링해야한다는 것을 의미합니다.

나는 이전 스타일 C에 도움이 될 수 있다고 감히 -하지만 C# .NET을 쓰고있을 때, 나는 C에서 유용하지만 내 C# :

3

을 개선하지 않는 일을 할 이유가 없다 대부분의 개발자들은 범위 지정에 대해 매우 부주의합니다. 나는 "여분의"변수를 할당 할 필요가 없도록 모든 것을 가능한 한 높게 평가하는 개발자들과 함께 일했습니다. 이것은 보통 사람들이 스택 변수를 이해하지 못하기 때문에 메모리를 절약하고 있다고 생각하기 때문입니다. 그럼에도 불구하고 foreach 루프 외부에서 변수를 초기화하면 절약 할 수있는 비용은 적지 만 신경 쓰지는 않을지라도 올바른 작업을 수행하고 있습니다.

foreach (var item in photos) 
    { 
     int h = 0; 
     buffer = t.NewRow(); 
     h = item.IndexOf("\\x\\"); 
     buffer["name"] = item.Substring(h, item.Length - h); 
     t.Rows.Add(buffer); 
    } 

:

+3

+1 각 반복 반복을 재 선언 할 필요가 없기 때문에 최소한의 절약이 있음을 인식하기 위해 +1 –

3

여전히 블록에서 문 전에 선언 할 변수를 필요로 C의 버전을 사용하는 경우에도, 다음은 비 디버그 빌드에는 병 성능 효과가 없습니다 컴파일러는 h의 'initialization'이 실제로 사용되지 않는다는 것을 인식하므로 (루프를 통한 첫 번째 반복에서도) 방해하지 않습니다. 컴파일러는 심지어 h을 재 할당하는 것을 성가 시게하지 않을 것입니다 (기회는 단순히 레지스터 일뿐입니다).

컴파일러가 최적화 할 수없는 작업을 수행하는 생성자/소멸자가있는 C++의 객체 유형이 h 인 경우 루프 밖으로 h의 선언을 수행해야 할 수도 있습니다.

2

다른 사람들이 지적했듯이이 예는 좋지 않습니다.

그렇지 않으면 범위 지정이 의미가 있기 때문에 범위 지정이 사용되지 않습니다. 함수를 작성하는 것이 더 합리적입니다.

관련 문제