2009-06-15 5 views
0

나는 약간 둘러 보았으며 그에 상응하는 질문을 찾지 못했습니다.
이 코딩 방법이 좋지 않습니까? 나는 그것을 쉽게 읽을 수 있지만 코드를 읽는 누군가에게 너무 모호한가?평가자를 3 진 표현으로 통합하는 것이 좋지 않습니까? (C#)

bool? testBool = null; 
string result; 
result = (testBool ?? false ? "Yes" : "No"); 

편집 : 일부 끔찍한 코드에 대한 모든 사람에게 나의 사과! 여기에 실제 예제가 있습니다.
나는 답장의 속도에 조금 압도되어 있습니다. 나는 이것을 삭제하고 바로 할 것이지만 이미 4 개의 답을 가지고있었습니다!

+0

나는 그것이 어둡게 생각합니다! –

+0

나는이 코드가 testbool이 정수인 것처럼 컴파일하지 않을 것이라고 생각한다. –

+1

변경 후 컴파일되지만 IMHO는 읽을 수 없다. –

답변

10

괄호를 추가하여 진행 상황을 명확히합니다. 그와

bool? testbool = null; 
string result; 
result = (testbool ?? false) ? "Yes" : "No"; 

, 나는 그것으로 잘 될 것입니다. 그것 없이는 무엇이 진행되고 있는지 파악하기 위해 조금씩 공부해야했습니다 (컴파일하는 경우 - 내 머리 꼭대기에서 작동 순서를 모르는 경우 :

).
+4

+1 많은 도움이됩니다. 원본 표현은 WTF입니다 ("코드 품질의 유일한 측정 - WTF/분"의 의미에서). – peterchen

2

편집 : 원래 질문은 int?입니다. 이제 수정되었습니다.

그 코드는 컴파일되지 않습니다. 그렇기 때문에 나는 너무 지나치다는 것을 말하고 싶습니다.

오타 제외하고, 사실은 쉽게 문제가 (당신이 LHS는 int?이다 ??의 RHS,에 bool을 사용하려는)을 제안가 있다는에 얼룩을지게하지 않고 게시하는 아니다 당신이 그것을 올바르게 할 때조차도 좋은 생각입니다.

현실 세계의 예제를 볼 필요가 있지만 대개은 null 병합 연산자를 사용하여 하나의 명령문으로 분할 한 다음 조건부 연산자를 사용하여 다른 명령문으로 분할합니다. 다른 옵션은 연산자와 관련하여 null 입력 가능 유형의 동작을 사용하는 것이지만 ... 은 합리적으로입니다. (나는 그 행동이 무엇인지 정확하게 생각해야만했다.)

나는 일반적으로 null 통합 연산자를 좋아하지만, 조건 연산자와 결합하면 그냥 애매하게 만든다. 단일 표현식 (예 : 대안이 추가 메소드를 도입하는 초기화)에 상당한 이점이있는 경우이를 수용한다고 생각하지만, 일반적으로이를 두 개의 명령문으로 분할하는 것을 선호합니다.

는 편집 :이 특별한 경우 그냥 "사실"에 대해 비교하는 것입니다 에서 하나의 대안 - 중복 보이는,하지만 bool?의 경우되지 않습니다 :

result = (testBool == true) ? "Yes" : "No"; 

브래킷은 필요하지 않습니다 , 당연히, 그러나 명확성 IMO를 추가하십시오.

나는 이것이 더 간단하다고 생각한다. testBool이 실제로 사실이면 결과는 "예"이다. 그렇지 않으면 "아니오"입니다. "기본값"을 Yes로 지정하려면 다음과 같이 작성하십시오.

result = (testBool == false) ? "No" : "Yes"; 
+0

당신이 옳다면, 실제로 프로덕션 코드를 참조하지 않고 예제를 게시하려고합니다. 나는 적절한 예를 든 후에 질문을 삭제할 것입니다. – CaptainCasey

+0

삭제할 수 없습니다 .. 편집이 충분해야합니다. – CaptainCasey

1

감싸고 괜찮다고 생각합니다.

string result = (testbool ?? false) ? "Yes" : "No"; 

그렇지 않은 경우 의도 한 작동 순서는 작동하지 않더라도 명백하지 않습니다.

(편집 : 조나단은 핀치에 의해 나를 이길.)

0

그것이

bool? testbool = null; 

있어야하지 않나요?

여기서 Null 입력란을 사용할 필요가 없습니다. 이 날 두 번 생각하게한다, 그래서 나는 정말 당신의 예제가 불완전하면 나도 몰라

bool testbool = false; 
string result; 
result = testbool ? "Yes" : "No"; 

로 코드 싶지만, 다음 null 값을 사용하는 것보다 더 온건 인 디폴트 값으로 변수를 초기화하는 생각 the ?? 연산자를 사용하여 선언 다음에 값을 설정하십시오.

string result = testbool ?? (false ? "Yes" : "No"); 

당신은 대신 nullable 형식의 GetValueOrDefault 방법을 사용할 수 있습니다 :

string result = (testbool ?? false) ? "Yes" : "No"; 

나 : 같은 표현식이 평가되는 경우

그것은 비밀 측에 약간의
2

은, 심지어는 분명 아니다 ?? 연산자를 사용하면 더 읽기 쉽게 만들 수 있습니다.

bool? testbool = null; 
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");