C#에서는 상태를 나타내는 순서의 실행 속도에 차이가 있습니까?왜 C#에서는 "variable! = null"대신 "null! = variable"이 표시되는 이유는 무엇입니까?
if (null != variable) ...
if (variable != null) ...
최근에 저는 첫 번째 것을 자주 보았습니다. 두 번째 것에 익숙했기 때문에 주목을 끌었습니다.
차이가없는 경우 첫 번째 장점은 무엇입니까?
C#에서는 상태를 나타내는 순서의 실행 속도에 차이가 있습니까?왜 C#에서는 "variable! = null"대신 "null! = variable"이 표시되는 이유는 무엇입니까?
if (null != variable) ...
if (variable != null) ...
최근에 저는 첫 번째 것을 자주 보았습니다. 두 번째 것에 익숙했기 때문에 주목을 끌었습니다.
차이가없는 경우 첫 번째 장점은 무엇입니까?
C에서 보류입니다. 잘못된 컴파일러를 사용하거나 경고가 충분히 높게 표시되지 않으면 경고없이 컴파일됩니다 (실제로는 합법적 인 코드).
당신이 실제로 아마 의미// Probably wrong
if (x = 5)
if (x == 5)
당신은 수행하여 C에서이 문제를 해결할 수 있습니다
if (5 == x)
여기에 오타가 있으면 잘못된 코드가 표시됩니다.
자, C#에서는이 모든 것이 piffle입니다. 두 개의 부울 값 (희귀 한 IME)을 비교하는 경우가 아니라면 "if"문에서 부울 식을 시작해야하며 "x=5
"의 형식은 Boolean
이 아닌 Int32
이되므로 더 읽기 쉬운 코드를 작성할 수 있습니다.
동료의 코드에서이를 볼 수 있다면 현대 언어로 교육하고 앞으로 더 자연스러운 형식을 사용하도록 제안하는 것이 좋습니다. 당신이 연산자를 혼동하는 경우 그런 다음 다시 다음 컴파일 오류 싶어한다 또는 버그와 코드를 실행합니다 - - 올 버그 나에게
제 동료들은 모두 이걸로 정신을 차리고, if 후에도 하나의 문장에 대해서도 중괄호를 쓰고 싶습니다. (나중에 '실현하지 않고 무언가를 추가 할 경우에 대비하여). F #과 Boo (그리고 YAML)에 롤을 넣으십시오. 언어가 들여 쓰기가 불가능한 경우 언어의 일부로 만드십시오. – Benjol
중괄호 추가 *는 합리적입니다. IMO - C#은 문제가되지 않도록 시도하지 않습니다. 그것은 "상수 == 변수"문제와 매우 다릅니다. –
if (this! = that) {performAsSuch(); } 실제로는 아주 건강합니다. "나중에 추가하다"는 말은 (나 = 5) 오타를 피하거나 발견하지 않는 것 같은 약점에 대해 나에게 솔기가있다. – jpinto3912
나는 이것이 언어를 바꾼 C 프로그래머라고 생각한다.
C에서, 당신은 쓸 수 다음
int i = 0;
if (i = 1)
{
...
}
주의 코드가 난 다음 과제는 (1을 반환 변수에 1을 할당합니다 의미가 하나의 등호의 사용 expression)을 사용하고 if 문에서 1을 사용합니다.이 값은 true로 처리됩니다. 즉 위의 내용은 버그입니다.
그러나 C#에서는이 작업을 수행 할 수 없습니다. 이 둘 사이에는 실제로 차이가 없습니다.
"C#에서는 컴파일러가 불평하지 않고 if 문에 부울식이 필요하고 제공되는식이 int 유형이기 때문에"가능하지 않습니다. –
초기에는 사람들이 '!' (또는 평등을 위해 여분의 '='를 붙이기가 더 어렵습니다) 비교 대신 과제를 수행하십시오. 앞에 null을두면 null이 l 값이 아니기 때문에 버그 가능성을 제거합니다 (I.E. 할당 할 수 없습니다).
요즘 대부분의 컴파일러는 조건부로 할당 할 때 경고를하고 C#은 실제로 오류를 발생시킵니다. 대부분의 사람들은 var == null 스키마를 사용합니다. 일부 사람들에게 읽기 쉽기 때문입니다.
모든 C# 컴파일러 (C# 관련 질문)는 표현식이 부울이 아닌 "if"문을 컴파일하지 않아야합니다. –
이 사실을 반영하도록 편집되었습니다. – Rik
는 항상 당신이
@Shy을 선호하는 스타일이었다 예기치 않은 행동을 일으킨 이후에 나중에 길을 물으십시오.
나는 이미 다루어지고있는 안전을 이유로하는 것보다 "상수 == 변수"양식 * 기타 *를 선호하는 사람은 들어 본 적이 없다고 생각합니다. C#에서. –
필자는 "variable == constant"자신을 선호하지만 필자는 프로그래머가 자신이 더 자연스럽게 읽는다고 느껴졌 기 때문에 반대로 채택했습니다. – TheCodeJunkie
그들은 수년간의 세뇌를 통해 모든 사람들에게 배후 세뇌를 했습니까? 아니면 진정한 선택 이었습니까? –
한 가지 더 ...(. 예에 대한 정수 또는 문자열)이 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#에서는 모든 변수를 초기화하므로 해당 언어로 문제가 발생하지 않아야합니다.
첫 번째 비트에 대해 어떤 컴파일러를 사용하고 있는지 확실하지 않지만 일반적으로 경고와 함께 컴파일해야합니다. i의 값은 정의되어 있지 않지만 약간의 값이 있습니다. – Dolphin
물론 두 코드가 모두 컴파일됩니다! 그게 바로 문제입니다. 첫 번째 코드를 실행 해보면 "예외가 발생했습니다"라는 의미가 무엇인지 이해하게 될 것입니다 ... – karlipoppins
도 둘 사이의 차이점을 얻지 못합니다. 너 좀 알 수 있니? – mfazekas
첫 번째 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
}
}
이것은 잘못되었습니다. Downvoted. 간단히 마우스를'=='연산자 위로 가져 가서 거기에 놓으면 두 경우 모두 사용자 정의 과부하가 사용됩니다. 물론'b' 전에'a'를 확인한 다음 오른쪽 피연산자에서 왼쪽 피연산자로 a의 위치를 바꿀 경우 미묘한 차이를 만들 수 있습니다. 그러나'a' 전에'b'를 검사 한 다음'b == null'을 역순으로 검사 할 수도 있습니다.이것은 조작자가 스스로를 호출하는 것을 혼란스럽게합니다. 대신 원하는 오버로드를 얻기 위해 피연산자 (또는 둘 다)를'object'로 캐스팅하십시오. 'if ((object) a == null)'또는'if (a == (object) null)'와 같이. –
: 여기
은 예입니다. 그러나 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 ...
다른 방법이 있다면, 무효 검사를보기 위해 항상 을까지 스캔해야합니다. 어떤 종류의 검사가 이루어 졌는지 알아보기 위해 비틀 거리게됩니다. 따라서 구문 강조 표시가 도움이 될 수 있지만 키워드가 앞부분이 아닌 줄 끝 부분에있을 때 항상 느리게 표시됩니다.
이 규칙을 따르는 데 어떤 이점도 보이지 않습니다. 부울 유형이 존재하지 않는 C에서, 그것은
if(5 == variable)
오히려 당신이 eaqual 기호 중 하나를 잊어 버린 경우 때문에, 당신은
if (variable = 5)
로 끝날
if (variable == 5)
이상 작성하는 유용
변수에 5를 할당하고 항상 true로 평가합니다. 그러나 Java에서 부울은 부울입니다. 그리고! =로, 전혀 이유가 없습니다.
한 좋은 충고는하지만, 그것은 NullPointerExceptions를을 방지하는 데 도움이 있기 때문에
if (CONSTANT.equals(myString))
보다는
if (myString.equals(CONSTANT))
을 작성하는 것입니다.
제 조언은 규칙의 정당성을 묻는 것입니다. 아무도 없다면, 그 이유를 따르십니까? 가독성에 도움이되지 않습니다.
http://www.wikiwand.com/en/Yoda_conditions –
일부 프로그래밍 언어는 if 조건에서 값을 초기화하는 것을 지원합니다. 그러한 언어에서 LValue와 RValue를 비교하려면 if (1 == i)와 같이 왼쪽에 리터럴을 사용하는 것이 좋습니다. 우연히 우리가 == ==를 넣으면 실수로 컴파일러 오류가 발생합니다. –