2008-11-07 2 views
91

C#에서는 상태를 나타내는 순서의 실행 속도에 차이가 있습니까?왜 C#에서는 "variable! = null"대신 "null! = variable"이 표시되는 이유는 무엇입니까?

if (null != variable) ... 
if (variable != null) ... 

최근에 저는 첫 번째 것을 자주 보았습니다. 두 번째 것에 익숙했기 때문에 주목을 끌었습니다.

차이가없는 경우 첫 번째 장점은 무엇입니까?

+0

http://www.wikiwand.com/en/Yoda_conditions –

+0

일부 프로그래밍 언어는 if 조건에서 값을 초기화하는 것을 지원합니다. 그러한 언어에서 LValue와 RValue를 비교하려면 if (1 == i)와 같이 왼쪽에 리터럴을 사용하는 것이 좋습니다. 우연히 우리가 == ==를 넣으면 실수로 컴파일러 오류가 발생합니다. –

답변

148

C에서 보류입니다. 잘못된 컴파일러를 사용하거나 경고가 충분히 높게 표시되지 않으면 경고없이 컴파일됩니다 (실제로는 합법적 인 코드).

당신이 실제로 아마 의미
// Probably wrong 
if (x = 5) 

if (x == 5) 

당신은 수행하여 C에서이 문제를 해결할 수 있습니다

if (5 == x) 

여기에 오타가 있으면 잘못된 코드가 표시됩니다.

자, C#에서는이 모든 것이 piffle입니다. 두 개의 부울 값 (희귀 한 IME)을 비교하는 경우가 아니라면 "if"문에서 부울 식을 시작해야하며 "x=5"의 형식은 Boolean이 아닌 Int32이되므로 더 읽기 쉬운 코드를 작성할 수 있습니다.

동료의 코드에서이를 볼 수 있다면 현대 언어로 교육하고 앞으로 더 자연스러운 형식을 사용하도록 제안하는 것이 좋습니다. 당신이 연산자를 혼동하는 경우 그런 다음 다시 다음 컴파일 오류 싶어한다 또는 버그와 코드를 실행합니다 - - 올 버그 나에게

+6

제 동료들은 모두 이걸로 정신을 차리고, if 후에도 하나의 문장에 대해서도 중괄호를 쓰고 싶습니다. (나중에 '실현하지 않고 무언가를 추가 할 경우에 대비하여). F #과 Boo (그리고 YAML)에 롤을 넣으십시오. 언어가 들여 쓰기가 불가능한 경우 언어의 일부로 만드십시오. – Benjol

+41

중괄호 추가 *는 합리적입니다. IMO - C#은 문제가되지 않도록 시도하지 않습니다. 그것은 "상수 == 변수"문제와 매우 다릅니다. –

+5

if (this! = that) {performAsSuch(); } 실제로는 아주 건강합니다. "나중에 추가하다"는 말은 (나 = 5) 오타를 피하거나 발견하지 않는 것 같은 약점에 대해 나에게 솔기가있다. – jpinto3912

9

나는 이것이 언어를 바꾼 C 프로그래머라고 생각한다.

C에서, 당신은 쓸 수 다음

int i = 0; 
if (i = 1) 
{ 
    ... 
} 

주의 코드가 난 다음 과제는 (1을 반환 변수에 1을 할당합니다 의미가 하나의 등호의 사용 expression)을 사용하고 if 문에서 1을 사용합니다.이 값은 true로 처리됩니다. 즉 위의 내용은 버그입니다.

그러나 C#에서는이 작업을 수행 할 수 없습니다. 이 둘 사이에는 실제로 차이가 없습니다.

+1

"C#에서는 컴파일러가 불평하지 않고 if 문에 부울식이 필요하고 제공되는식이 int 유형이기 때문에"가능하지 않습니다. –

4

초기에는 사람들이 '!' (또는 평등을 위해 여분의 '='를 붙이기가 더 어렵습니다) 비교 대신 과제를 수행하십시오. 앞에 null을두면 null이 l 값이 아니기 때문에 버그 가능성을 제거합니다 (I.E. 할당 할 수 없습니다).

요즘 대부분의 컴파일러는 조건부로 할당 할 때 경고를하고 C#은 실제로 오류를 발생시킵니다. 대부분의 사람들은 var == null 스키마를 사용합니다. 일부 사람들에게 읽기 쉽기 때문입니다.

+0

모든 C# 컴파일러 (C# 관련 질문)는 표현식이 부울이 아닌 "if"문을 컴파일하지 않아야합니다. –

+0

이 사실을 반영하도록 편집되었습니다. – Rik

0

는 항상 당신이

@Shy을 선호하는 스타일이었다 예기치 않은 행동을 일으킨 이후에 나중에 길을 물으십시오.

+0

나는 이미 다루어지고있는 안전을 이유로하는 것보다 "상수 == 변수"양식 * 기타 *를 선호하는 사람은 들어 본 적이 없다고 생각합니다. C#에서. –

+0

필자는 "variable == constant"자신을 선호하지만 필자는 프로그래머가 자신이 더 자연스럽게 읽는다고 느껴졌 기 때문에 반대로 채택했습니다. – TheCodeJunkie

+1

그들은 수년간의 세뇌를 통해 모든 사람들에게 배후 세뇌를 했습니까? 아니면 진정한 선택 이었습니까? –

-4

한 가지 더 ...(. 예에 대한 정수 또는 문자열)이 NullPointerExceptions를에 실행하지 않을 것이기 때문에 당신이 상수 변수를 비교하는 경우, 왼쪽에 상수를 넣어 좋은 방법입니다 :

int i; 
if(i==1){  // Exception raised: i is not initialized. (C/C++) 
    doThis(); 
} 

int i; 
if(1==i){  // OK, but the condition is not met. 
    doThis(); 
} 

반면,

기본적으로 C#에서는 모든 변수를 초기화하므로 해당 언어로 문제가 발생하지 않아야합니다.

+1

첫 번째 비트에 대해 어떤 컴파일러를 사용하고 있는지 확실하지 않지만 일반적으로 경고와 함께 컴파일해야합니다. i의 값은 정의되어 있지 않지만 약간의 값이 있습니다. – Dolphin

+0

물론 두 코드가 모두 컴파일됩니다! 그게 바로 문제입니다. 첫 번째 코드를 실행 해보면 "예외가 발생했습니다"라는 의미가 무엇인지 이해하게 될 것입니다 ... – karlipoppins

+0

도 둘 사이의 차이점을 얻지 못합니다. 너 좀 알 수 있니? – mfazekas

12

첫 번째 null을 사용하는 좋은 이유가 있습니다 : if(null == myDuck)

경우 class Duck== 연산자를 우선은, 다음 if(myDuck == null) 무한 루프에 갈 수 있습니다.

null을 사용하면 먼저 기본 동등 비교를 사용하여 실제로 의도 한 바를 수행합니다.

(필자는 결국이 방법으로 작성된 코드를 읽는 것에 익숙해 져 있습니다. 아직 변태를 경험하지 못했습니다.) 모두가 이미 실수로 두 번째 등호 잊어 버린 경우 잘못된 코드를 얻을 수있는 C 언어에서 더 많거나 적게 온다 지적처럼

public class myDuck 
{ 
    public int quacks; 
    static override bool operator ==(myDuck a, myDuck b) 
    { 
     // these will overflow the stack - because the a==null reenters this function from the top again 
     if (a == null && b == null) 
      return true; 
     if (a == null || b == null) 
      return false; 

     // these wont loop 
     if (null == a && null == b) 
      return true; 
     if (null == a || null == b) 
      return false; 
     return a.quacks == b.quacks; // this goes to the integer comparison 
    } 
} 
+9

이것은 잘못되었습니다. Downvoted. 간단히 마우스를'=='연산자 위로 가져 가서 거기에 놓으면 두 경우 모두 사용자 정의 과부하가 사용됩니다. 물론'b' 전에'a'를 확인한 다음 오른쪽 피연산자에서 왼쪽 피연산자로 a의 위치를 ​​바꿀 경우 미묘한 차이를 만들 수 있습니다. 그러나'a' 전에'b'를 검사 한 다음'b == null'을 역순으로 검사 할 수도 있습니다.이것은 조작자가 스스로를 호출하는 것을 혼란스럽게합니다. 대신 원하는 오버로드를 얻기 위해 피연산자 (또는 둘 다)를'object'로 캐스팅하십시오. 'if ((object) a == null)'또는'if (a == (object) null)'와 같이. –

8

: 여기

은 예입니다. 그러나 C# : Readability와 일치하는 또 다른 이유가 있습니다.

if(null != someVariableThatShouldBeChecked 
    && null != anotherOne 
    && null != justAnotherCheckThatIsNeededForTestingNullity 
    && null != allTheseChecksAreReallyBoring 
    && null != thereSeemsToBeADesignFlawIfSoManyChecksAreNeeded) 
{ 
    // ToDo: Everything is checked, do something... 
} 

그래서 예 : 당신은 단순히 시작 할 수 있습니다 훨씬 쉽게 현장의 모든 검사에 모든 단어를 교체 할 경우

if(someVariableThatShouldBeChecked != null 
    && anotherOne != null 
    && justAnotherCheckThatIsNeededForTestingNullity != null 
    && allTheseChecksAreReallyBoring != null 
    && thereSeemsToBeADesignFlawIfSoManyChecksAreNeeded != null) 
{ 
    // ToDo: Everything is checked, do something... 
} 

:

그냥 간단한 예를 들자면 (코드 작성 지침 참조) 나쁜 예일 수 있지만 전체 코드 파일을 빠르게 스크롤 할 수 있다고 생각하면됩니다. 간단히 패턴을 보면, 다음에 오는 것을 즉시 알 수 있습니다.

if(null ... 

다른 방법이 있다면, 무효 검사를보기 위해 항상 까지 스캔해야합니다. 어떤 종류의 검사가 이루어 졌는지 알아보기 위해 비틀 거리게됩니다. 따라서 구문 강조 표시가 도움이 될 수 있지만 키워드가 앞부분이 아닌 줄 끝 부분에있을 때 항상 느리게 표시됩니다.

4

이 규칙을 따르는 데 어떤 이점도 보이지 않습니다. 부울 유형이 존재하지 않는 C에서, 그것은

if(5 == variable) 

오히려 당신이 eaqual 기호 중 하나를 잊어 버린 경우 때문에, 당신은

if (variable = 5) 
로 끝날

if (variable == 5) 

이상 작성하는 유용

변수에 5를 할당하고 항상 true로 평가합니다. 그러나 Java에서 부울은 부울입니다. 그리고! =로, 전혀 이유가 없습니다.

한 좋은 충고는하지만, 그것은 NullPointerExceptions를을 방지하는 데 도움이 있기 때문에

if (CONSTANT.equals(myString)) 

보다는

if (myString.equals(CONSTANT)) 

을 작성하는 것입니다.

제 조언은 규칙의 정당성을 묻는 것입니다. 아무도 없다면, 그 이유를 따르십니까? 가독성에 도움이되지 않습니다.

관련 문제