2011-04-20 5 views
8

난 그냥C 번호 : 찾기 버그 :

bool first = true; 

foreach (RdAbstractNode node in listNodes) 
{ 
    if (!first) 
    { 
     // do stuff (does not change first) 
    } 
    // do more stuff (does not change first) 
} 

당신이 first을 볼 수 있듯이 (디버깅의 양 찢어 내 머리 후) 내 프로그램에서 버그를 발견했습니다 (false)를하면 항상 true 없다 - 결코 변경되었습니다. 따라서 if(!first)은 기본적으로 if(false)입니다.
컴파일러는 수준 4 (최상위 수준)로 설정되어 있지만 경고를 생성하지 않았습니다.

비슷한 if(false)은 어떻게 찾을 수 있습니까? 내가 VS 2010를 사용하고

, 닷넷 4.0 컴파일러, 프로젝트는 닷넷 2.0

+2

당신의'// 물건을 남기다 '는'처음으로 뒤집을 수있는 '일을 할 수 있지만, 항상 거짓이거나 진실 인 물건에 대한 Resharper의 경고를 보았습니다. –

+0

또는 오히려'더 많은 것들을해라 .'는 변수를 뒤집은 것이어야합니다. – cdeszaq

답변

13

enter image description here

+1

+1 Resharper를 추천하기. 가격이 비싼 애드온이지만, 이런 경우에는 매우 유용합니다. – Pretzel

+0

무료로 제공되는 프로그램이 있습니까? 아니면 학업 면허로 42 유로를 지출해야합니까? –

+0

@Pretzel : "귀중한"스트레칭입니다. – jason

10

내가 당신을 도울 것입니다 컴파일러의 기능을 알지 못한다 설정 - 당신이 단위 테스트를해야합니다. 예를 들어, - Resharper

+0

컴파일러에서 할당되지 않은 변수에 대해 경고합니다. 변수에 상수 값이 있는지 여부는 알 수 있습니다. 하지만 그것은'if (false)'에 대해서조차 경고하지 않습니다. –

+0

@imon Ottenhaus : 할당되지 않은 변수는 여러분이 여기있는 것과 매우 다릅니다. – jason

+0

if (false) 블록에 코드가 있으면 컴파일 경고 메시지가 나타납니다. 주석 만있는 경우 컴파일러는 경고없이 블록을 최적화하는 것으로 나타납니다. 나는 @dahlbyk에 동의한다. 아마 코드 커버리지 분석이나 정적 분석기를 사용하고 싶을 것이다. 경고가 아닌 이유를 알고 싶다면이 도움말을 참조하십시오. http://blogs.msdn.com/b/ericlippert/archive/2011/03/03/danger-will-robinson.aspx – mcw0933

0

같은 경고를 얻을 것이다 컴파일러는 if 문에서 상수 값을 기준으로 도달 할 수없는 코드와 같은 명백한 것들을 경고합니다 "if (false)". 그러나 변수가 변경 될 수 있기 때문에이 경우 불행하게도하지 않습니다.

1

나는 Resharper가 가지고있는 좋은 도구라고 동의하지만, 나는 이것이 내가이 구조를 사용하지 않는 이유를 설명한다고 생각한다고 덧붙이고 싶습니다.

대안이 될 수 있습니다

편집 :

//.net 4.0 
    var firstNode = listNodes.First(); 
     //do something special for first. 

    foreach(var node in listNodes.Skip(1)) 
    { 
     //do something for the rest. 
    } 

//.net 2.0 
using (IEnumerator<RdAbstractNode> enumerator = listNodes.GetEnumerator();) 
{ 
    if (!enumerator.MoveNext()) 
     return; 

    RdAbstractNode first = enumerator.Current; 
    //do something with first 
    while(enumerator.MoveNext()) 
    { 
     RdAbstractNode currentNode = enumerator.Current; 
     //do something with the node. 
    } 
} 

우리는 종종 때로는 논리를 변경하기 위해 더 나은, 자신이 첫 번째 요소에 대한 특별한 처리의 일종이 필요 찾을 수 모든 가공 유니폼. 우리가 그럴 수 없다면 특별한 케이스 처리를 중첩하는 대신 나머지 요소와 명확히 구분하는 것을 항상 선호합니다.

+0

.Net 2.0 : No Skip (1) –

+0

mm.missed - 그러나 long (er) 방식으로 수행 할 수 있습니다. 'var enumerator = listNodes.GetEnumerator(); enumerator.MoveNext(); var first = 열거 자. 현재; while (enumerator.MoveNext()) { // 열거 자로 현재 작업 수행 } – NightDweller

+0

'IEnumerator '를 삭제해야합니다. 그리고 적절한 경우'false'를 반환하는 첫 번째 MoveNext() 호출을 처리해야합니다. – dahlbyk