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