조건식에서 널 입력 가능 부울을 확인하는 가장 좋은 방법 (…


207

nullable bool에 대한 조건 검사를 수행하는 데 가장 깨끗하고 이해하기 쉬운 구문이 무엇인지 궁금했습니다.

다음은 좋은 코딩 스타일입니까? 상태를 더 좋고 깨끗하게 표현할 수있는 방법이 있습니까?

bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }

특히 if (nullableBool ?? false) 부분. 나는 if (x.HasValue && x.Value)스타일이 마음에 들지 않습니다 ...

(질문이 이전에 질문되었는지 여부는 확실하지 않습니다 ... 검색과 비슷한 것을 찾을 수 없습니다)

답변:


361

많은 사람들 이이 가치가 nullable이라는 사실에 집중하고 실제로 원하는 것에 대해 생각하지 않습니다. :)

bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else { ... } // false or null

또는 더 많은 옵션을 원한다면 ...

bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else if (nullableBool == false) { ... } // false
else { ... } // null

(nullableBool == true)bool 경우 절대로 true를 반환하지 않습니까? null : P


2
나는 nullable 비교가 이와 같이 의미가 있다는 것을 몰랐다. 자세한 내용은 msdn.microsoft.com/en-us/library/2cf62fcy.aspx
Micah Zoltu

79

GetValueOrDefault 를 사용 하는 것은 어떻습니까? 자체적으로 설명하고 원하는 기본값을 사용할 수 있습니다.

if (nullableBool.GetValueOrDefault(false)) {
}

6
상황에 System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
따라이

3
이 접근법은 if가 아닌 진술 (즉 과제)에서도 ​​작동하기 때문에이 접근법을 좋아합니다.
paultechguy

48

당신은 그것을 좋아하지 않을 수 있지만, 개인적으로 나는 찾아

if (x.HasValue && x.Value)

가장 읽기 쉬운. 널 입력 가능 유형으로 작업하고 있음을 분명히하고 조건부로 작동하기 전에 널 입력 가능 유형에 값이 있는지 먼저 확인하고 있음을 알 수 있습니다.

버전을 가져 와서 변수를 x로 바꾸면 다음과 같이 읽습니다.

if (x ?? false)

그게 분명한가요? x가 nullable 유형이라는 것이 명백합니까? 내가 결정하게 해줄 게


afaik, ?? 널 입력 가능 유형에서만 작동합니다. 또한 변수의 이름은 x :)보다
좋아야합니다.

5
"널링 가능 유형"이란 구체적으로 System.Nullable 유형을 의미했습니다. 모든 참조 유형은 null 일 수 있습니다. 또한 이름의 일부로 변수 유형을 사용해야하는 경우 코드가 명확하지 않음을 나타냅니다.
Dan Diplo

@DanDiplo UT를 작성하는 방법?
Prashant Yadav

x상황이 좋으며 때로는 더 깨끗합니다. 재치 :var openOrders = orders.Where(x=>x.Open ?? false)
아무것도 불필요

21

null을 false 로 취급 하려면 가장 간결한 방법은 다음과 같이 null 병합 연산자 ( ??) 를 사용하는 것입니다.

if (nullableBool ?? false) { ... }

8

부울 만 생각해? 3 개의 값을 가지면 일이 쉬워집니다.

if (someNullableBool == true)     // only if true
if (someNullableBool == false)    // only if false
if (someNullableBool == null)     // only if null

8

확장을 사용하십시오.

public static class NullableMixin {
    public static bool IsTrue(this System.Nullable<bool> val) {
        return val == true;
    }
    public static bool IsFalse(this System.Nullable<bool> val) {
        return val == false;
    }
    public static bool IsNull(this System.Nullable<bool> val) {
        return val == null;
    }
    public static bool IsNotNull(this System.Nullable<bool> val) {
        return val.HasValue;
    }
}


Nullable<bool> value = null;
if(value.IsTrue()) {
// do something with it
}

당신이 고려할 경우 nulltrue?
Thibault Falise

IsTrue () | IsNull () .. :) SQL에서 null이 작동하는 방식을 논리로 재현했습니다. 가장 깨끗하고 이해하기 쉬운 구문이라고 생각합니다.
Andrey Frolov

공개 정적 부울이어야합니다. IsFalse (이 System.Nullable val) {return! val ?? 진실; } null로 거짓으로 간주
Michael Freidgeim

2
마지막 두 가지 방법 (예 : ISNULL 및 IsNotNull)에서 ()는 세미콜론 누락 될 수 있습니다
글렌 슨

4

null과의 비교가 어떻게 정의되는지 확인하자 :

static void Main()
    {
        Console.WriteLine($"null != null  => {null != null}");
        Console.WriteLine($"null == null  => {null == null}");
        Console.WriteLine($"null != true  => {null != true}");
        Console.WriteLine($"null == true  => {null == true}");
        Console.WriteLine($"null != false => {null != false}");
        Console.WriteLine($"null == false => {null == false}");
    }

결과는 다음과 같습니다.

null != null  => False                                                                                                                                                                                                                                  
null == null  => True                                                                                                                                                                                                                                   
null != true  => True                                                                                                                                                                                                                                   
null == true  => False                                                                                                                                                                                                                                  
null != false => True                                                                                                                                                                                                                                   
null == false => False

따라서 다음을 안전하게 사용할 수 있습니다.

// check if null or false
if (nullable != true) ...

// check if null or true
if (nullable != false) ...

// check if true or false
if (nullable != null) ...

만약 우리가 처리 할 수는 있지만주의해서 if(nullable)...else if(!nulllable)...else..
다루어야

지난 몇 년간 코딩 스타일 (stylecop, 분석기 등과 같은 도구의 가용성으로 인해)은 모호하지 않고 명확하고 "의도 확인"코드를 선호합니다 (예 : 의도 된 사용법을 확인하기 위해 불필요한 괄호 사용을 권장 함) 운영자 우선 순위 또는 다양한 주석 / 계약 시스템 사용). 이러한 구문을 도입 한 IMO는 Nullable이 이익보다 처리되는 방식의 불명확성으로 인해 훨씬 ​​더 혼란 스러울 수 있습니다.
Sz. Moncz

4

실제로 나는 그것이 (nullableBool ?? false)linq에서 nullable bool을 평가하려고 할 때 특히 합법적 인 옵션 이라고 생각합니다 .

예를 들면 다음과 같습니다.
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)

내 의견 으로는 다음과 반대로 깨끗 합니다.
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)


1

당신은 단지에 대한 테스트하려는 경우 true에 대하여 null/ false, 하나 그냥 사용하고 아주 잘 읽습니다

bool? someCondition = null
if (someCondition.Equals(true))
...

1
여기서 null 참조 예외가 발생하지 않습니까?
체이스 플 로렐

@ChaseFlorell VS Interactive 창에서 이것을 다시 확인해야했습니다. 따라서 기억해야 할 것은 조건의 유형이 Nullable <bool>이라는 것입니다. 객체 (예 : 같음), HasValue 및 GetValueOrDefault에서 상속 된 메소드를 계속 호출 할 수 있습니다 , 가치는 없음
ds4940

흥미 롭습니다. 지금 볼 수 있습니다. 참조 유형 dotnetfiddle.net/8cAI21
Chase Florell

0

나는 당신에게 달려 있다고 생각합니다. 필자는 .HasValue 접근 방식이 특히 읽기에 익숙하지 않은 개발자에게 더 읽기 쉽다고 생각합니다. 통사론.

nullable 부울 형식의 다른 점은 tristate이므로 null이 아닌 다른 작업을 수행 할 수 있으며 기본값은 false가 아닙니다.


0

주어진 열거

public enum PublishMode { Edit, View }

당신은 여기처럼 할 수 있습니다

 void MyMethod(PublishMode? mode)
    {
       var publishMode = mode ?? PublishMode.Edit;

//or
       if (mode?? PublishMode.Edit == someValue)
       ....
    }

질문에 대한 답변이 아닙니다 nullable boolean. 구체적으로에 관한 것 입니다.
ToolmakerSteve

0

조건의 일부가 널 입력 가능 값을 점검하는지 여부를 제어 할 수없는 상황에서는 항상 다음을 시도 할 수 있습니다.

if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
    //perform your actions if true
}

필자는 if 문에 삼항을 넣는 순수한 접근 방식이 아니라 문제를 깨끗하게 해결한다는 것을 알고 있습니다.

물론 이것은 수동으로 말하는 방법입니다 GetValueOrDefault(false)


3
OP에서 제공되는 솔루션은 동일하지만 코드 팽창이 훨씬 적습니다. 이것은 전혀 유리하지 않습니다.
Servy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.