2010-08-23 1 views
4

나를 실제 생활 예에서 시작하자 :C#의 "if"문을 비워야 오류 또는 경고가 발생합니까?

고객 : 알렉스, 그냥 라인 (138)에 RemovalProcessor 이상한 뭔가를 발견 :

if (Session.Handler.ExecutePrefetchTasks()==null); 
    Session.ExecuteDelayedQueries(); 

한다 '의 경우'일이 뒤에 semicolumn ?

Me : 죄송합니다. 확인을 위해이 내용을 보내 드리겠습니다.하지만 가장 가능성이 큽니다.

이 사례는 드뭅니다 만 거의 모든 대형 프로젝트에서 비슷한 문제가 있음을 인정합니다.

C#의 세미콜론 (및 명령문 블록) 사용 규칙을 변경할 수 없다는 것을 알고 있습니다. (개인적으로 파이썬 스타일을 선호합니다.) 그러나 을 문과 정확히 일치하는 사례로 식별하고 오류 또는 경고로 분류하는 것이 좋습니다.

거의 Q/A I 염두에두고 :

경고 또는 오류가이 경우에 생성해야하는 이유
  • ?

    개발자의 실수는 99 % 확률 일 수 있기 때문입니다.

  • 이 경우 오류가 바람직한 이유는 무엇입니까?

    많은 경우 개발자가 경고를 무시합니다.

    나는/warnaserror (위협 경고가 오류로 표시됨) 스위치라고 생각하지만이 오류는 매우 높은 확률 인 이므로 오류가 아니며 (실제로는? ;)) 이 문제를 쉽게 해결할 수 있으며이 경우 을 오류로 분류하는 것이 더 좋을 수 있습니다.

    마지막으로,이 경우 오류가 if 문없이 (그리고 가능성이 있어야 함) 항상 다시 작성 될 수있는 코드부터 개발자, 을 "제한"하지 않습니다.

  • 왜이 경우 경고가 바람직합니까?

    호환성을 손상시키지 않습니다. 또한 일부 코드 생성기 이 현재 동작에 의존하는 코드를 생성 할 수도 있습니다.

이 점에 대해 귀하의 의견을 듣고 싶습니다.

+0

Resharper는 다음과 같은 경고 메시지를 표시합니다 :-) – brendan

답변

12

그것은 이미 경고를 생성합니다

Possible mistaken empty statement 난 당신이 정말 하늘의 문을 원하는 경우, 항상 { }로 쓸 수 있습니다 (오류가 바람직했을 것이다 있음에 동의

, 이것은 더 명백합니다). 그러나 그들은 C# 언어를 이렇게 변경하지 않을 것입니다. 그것은 급격한 변화가 될 것이고, 나는 그들의 (읽기 : 에릭 리 퍼트) 정당화는 "이익이 비용보다 중요하지 않다"라고 의심한다.

+0

위대한 - 나도 이것을 알아 차리지 못했던 것 같습니다. –

+0

아마도 에릭 리 퍼트 (Eric Lippert)의 정당성에 관한 것입니다. 그러나이 경고가 내 자신의 팀 (최소한 팀원 수는 더 적었습니다)에서 빠진 것을 발견 한 후에도 오류가 있습니다. –

+7

@Alex : 프로젝트에 경고가 너무 많아서 모두들 무시하고 있음을 나타 냅니까? 어쩌면 당신은 코드가 더 이상 경고를 가지지 않도록 코드를 고치거나 코드가 좋다고 생각하는 장소에서'#pragma warning disable'을 사용하고 경고를 멈춰야한다고 생각할 수도 있습니다. 그런 다음 경고에 다시주의를 기울일 수 있습니다. – Timwi

0

이 예제에서는 조건부로 논리를 실행하는 목적으로 컴파일 오류가 발생하지 않아야합니다.

if (DoSomething() || SolveEquation()) ; // Intentional - compiles and runs as expected. 

if 키워드가 제거되면 컴파일 오류가 발생합니다. C 번호의

DoSomething() || SolveEquation(); // Compile ERROR. 

Short circuit logic 결정 : 해봐요()는 다음 true SolveEquation()를 평가되지 반환하는 경우; 그렇지 않으면 평가됩니다.

우리는 두 함수 모두 어떤 식 으로든 실행중인 프로그램의 상태를 변경한다고 가정 할 것이므로 어떤 프로그램이 실행되는지는 중요합니다. 특정 프로그램 상태를 결정할 것이기 때문입니다. 물론 더 잘 될 것이라고 작성하는 방법 ...

if (! DoSomething()) 
    SolveEquation(); 

또는 (코멘트에서이 일을 주셔서 감사합니다 Alex)

bool result = DoSomething() || SolveEquation(); 

.. 그런데 왜 강탈 첫 번째 방법의 사용자?

첫 번째 방법은 나쁜 형식이라고 주장 될 수 있기 때문에 상황에 따라 컴파일 오류가 발생하지 않을 수도 있습니다.

이것은 컴파일 오류이 발생하지 않아야한다는 나의 주장입니다. 기존의 경고는 개발자가 공통적 인 실수를 범한 경우를 대비하여 좋은 것입니다.

+0

IMHO, bool result = DoSomething() ||을 사용하는 것이 더 좋습니다. 이 경우 SolveEquation(); –

+0

안녕하세요. @Alex님께 감사드립니다. 크레딧으로 답변에 추가했습니다. –

관련 문제