[c#] C #에서 “variable! = null”대신 “null! = variable”이 자주 표시되는 이유는 무엇입니까?

C #에서 조건을 설명하는 순서에 대한 실행 속도에 차이가 있습니까?

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

최근부터 첫 번째를 자주 보았고 두 번째에 익숙해 져서 눈에 띄었습니다.

차이가 없다면 첫 번째의 장점은 무엇입니까?



답변

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

// Probably wrong
if (x = 5)

당신이 실제로 의미했을 때

if (x == 5)

C에서 다음을 수행하여이 문제를 해결할 수 있습니다.

if (5 == x)

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

이제 C #에서 이것은 모두 파이 플입니다. 두 개의 부울 값 (드물게 IME)을 비교하지 않는 한 “if”문은 시작하는 부울 표현식이 필요하고 ” x=5” 유형 은 Int32, 아니기 때문에 더 읽기 쉬운 코드를 작성할 수 있습니다 Boolean.

동료의 코드에서 이것을 본다면 현대 언어로 교육하고 미래에 더 자연스러운 형식을 작성하도록 제안하십시오.


답변

먼저 null을 사용하는 좋은 이유가 있습니다. if(null == myDuck)

귀하의 경우 class Duck오버라이드 (override) ==연산자, 후 if(myDuck == null)무한 루프에 갈 수 있습니다.

사용하여 null실제로 처음 사용에게 기본 같음 비교를하고 당신이 의도했는지 않습니다.

(결국 그런 식으로 작성된 코드를 읽는 데 익숙해 졌다고 들었습니다. 아직 그 변환을 경험하지 못했습니다).

다음은 예입니다.

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
    }
}


답변

모두가 이미 언급했듯이 실수로 두 번째 등호 기호를 잊어 버린 경우 잘못된 코드를 얻을 수있는 C 언어에서 다소간 발생합니다. 그러나 C #과 일치하는 또 다른 이유는 가독성입니다.

이 간단한 예를 들어 보겠습니다.

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

모든 null 단어를 처음으로 바꾸면 모든 검사를 훨씬 쉽게 찾을 수 있습니다.

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

따라서이 예제는 잘못된 예제 일 수 있지만 (코딩 지침 참조) 전체 코드 파일을 빠르게 스크롤하는 것에 대해 생각해보십시오. 단순히 패턴을보고

if(null ...

다음에 무엇이 올지 즉시 알 수 있습니다.

그 반대 의 경우에는 널성 검사를 확인하기 위해 항상 줄 끝까지 스캔 해야합니다. 그저 거기에서 어떤 종류의 검사가 수행되는지 알아 내기 위해 잠시 비틀 거리게합니다. 따라서 구문 강조가 도움이 될 수 있지만 해당 키워드가 앞줄이 아닌 줄 끝에 있으면 항상 속도가 느려집니다.


답변

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

C에서는 다음과 같이 작성할 수 있습니다.

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

여기에서 단일 등호를 사용하면 코드가 1을 변수 i에 할당 한 다음 1을 반환하고 (할당은 표현식) if 문에서 1을 사용하여 true로 처리됩니다. 즉, 위는 버그입니다.

그러나 C #에서는 이것이 불가능합니다. 실제로 둘 사이에는 차이가 없습니다.


답변

이전에는 사람들이 ‘!’를 잊어 버렸습니다. (또는 평등에 대한 추가 ‘=’, 찾기가 더 어렵습니다) 비교 대신 할당을 수행하십시오. null을 앞에두면 null은 l- 값이 아니므로 (IE를 할당 할 수 없음) 버그 가능성을 제거합니다.

대부분의 최신 컴파일러는 요즘 조건부 할당을 수행 할 때 경고를 표시하고 C #은 실제로 오류를 제공합니다. 대부분의 사람들은 일부 사람들이 읽기 쉽기 때문에 var == null 스키마를 고수합니다.


답변

이 규칙을 따를 때 어떤 이점도 보이지 않습니다. 부울 유형이 존재하지 않는 C에서는 다음과 같이 작성하는 것이 유용합니다.

if( 5 == variable)

보다는

if (variable == 5)

등호 중 하나를 잊어 버리면 결국

if (variable = 5)

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

하지만 한 가지 좋은 조언은

if (CONSTANT.equals(myString))

보다는

if (myString.equals(CONSTANT))

NullPointerExceptions를 피하는 데 도움이되기 때문입니다.

내 조언은 규칙의 정당성을 요청하는 것입니다. 없는 경우 왜 따라야합니까? 가독성에 도움이되지 않습니다


답변

나에게는 항상 당신이 선호하는 스타일이었습니다.

@Shy-그런 다음 연산자를 혼동하면 컴파일 오류가 발생하거나 버그가있는 코드를 실행해야합니다. 예기치 않은 동작을 생성했기 때문에 나중에 돌아와서 당신을 물어 뜯는 버그입니다.