Bir koşul ifadesinde null olabilecek boolü kontrol etmenin en iyi yolu (eğer…)


212

Nullable bools üzerinde durum kontrolleri yapmak için en temiz ve anlaşılır sözdiziminin ne olduğunu merak ediyordum.

Aşağıdaki iyi veya kötü kodlama tarzı mı? Durumu daha iyi / daha temiz bir şekilde ifade etmenin bir yolu var mı?

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

özellikle if (nullableBool ?? false) kısmı. Tarzdan hoşlanmıyorum if (x.HasValue && x.Value)...

(sorunun daha önce sorulup sorulmadığından emin değilim ... arama ile benzer bir şey bulamadık)

Yanıtlar:


366

Birçok insanın bu değerin null edilebilir olduğu gerçeğine odaklandığını ve aslında ne istediklerini düşünmediğini düşünüyorum :)

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

Veya daha fazla seçenek istiyorsanız ...

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

(nullableBool == true)bool ise asla doğru dönmeyecek? boş: P


2
Sıfırlanabilir karşılaştırmanın böyle anlamlı olduğunu fark etmedim. Ayrıntılar msdn.microsoft.com/en-us/library/2cf62fcy.aspx adresinde
Micah Zoltu

81

Kendini açıklayan ve istediğiniz varsayılanı kullanmanıza izin veren GetValueOrDefault'u kullanmaya ne dersiniz :

if (nullableBool.GetValueOrDefault(false)) {
}

6
Bağlama bağlı olarak bu yaklaşım System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
fırlayabilir

3
Ben de olmayan bir deyim (yani atama) çalışır gibi bu yaklaşımı seviyorum.
paultechguy

48

Hoşuna gitmeyebilir, ama şahsen buluyorum

if (x.HasValue && x.Value)

en okunabilir. Null olabilecek bir türle çalıştığınızı açıkça belirtir ve null edilebilir türün koşullu olarak işlem yapmadan önce bir değere sahip olup olmadığını kontrol ettiğinizi açıkça belirtir.

Sürümünüzü alıp değişkeni x ile değiştirirseniz:

if (x ?? false)

Bu açık mı? X'in boş değerli bir tür olduğu aşikar mı? Karar vermene izin vereceğim.


Bildiğim kadarıyla, ?? yalnızca null olabilecek türlerde çalışır. Artı değişken x :) daha güzel bir isme sahip olmalıdır
FireSnake

5
"Nullable type" ile özellikle System.Nullable türlerini kastediyorum. Herhangi bir referans türü boş olabilir. Ayrıca, değişkenin türünü isminin bir parçası olarak kullanmanız gerekiyorsa, bu kodunuzun net olmadığını gösterir.
Dan Diplo

@DanDiplo Bunun için UT nasıl yazılır?
Prashant Yadav

xbağlamda iyidir ve bazen daha temizdir; zekâ:var openOrders = orders.Where(x=>x.Open ?? false)
hiçbir şey

21

Eğer bir nullyanlış gibi davranmak istiyorsanız , o zaman bunu yapmanın en kısa yolunun ??tanımladığınız gibi boş birleşme operatörünü ( ) kullanmak olduğunu söyleyebilirim :

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

8

Sadece bool'u mu düşünüyorsun? 3 değeri olduğu için işler kolaylaşır:

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

8

Uzantıları kullanın.

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
}

Ne dikkate alınmasını istiyorsanız nullkadar true?
Nisan'da Thibault Falise

IsTrue () | IsNull () .. :) SQL null'larla nasıl çalıştığını mantığı yeniden oluşturdum. En temiz ve anlaşılır sözdizimi olduğunu düşünüyorum.
Andrey Frolov

Halka açık statik bool IsFalse (bu System.Nullable val) olmalıdır {return! Val ?? doğru; } null
değerini

2
Son iki yöntemde (yani IsNull ve IsNotNull) noktalı virgül (;) eksik olabilir
glenn garson

4

Null ile karşılaştırmanın nasıl tanımlandığını kontrol edelim:

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}");
    }

ve sonuçlar:

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

Böylece güvenle kullanabilirsiniz:

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

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

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

Sadece neden (nullable) .... yapamıyorum merak ediyorum merak ediyorum ama dikkatle tedavi edilmesi gerekiyorif(nullable)...else if(!nulllable)...else..
IronHide 10:18

Son yıllarda kodlama stilinin (stylecop, analizörler, vb. operatörlerin önceliği veya çeşitli ek açıklama / sözleşme sistemleri kullanma). Böyle bir sözdizimi getiren IMO, nullablerin nasıl ele alındığı açıklık düzeyi nedeniyle faydadan çok daha fazla karışıklığa neden olacaktır.
Sz. Moncz

4

Aslında bu (nullableBool ?? false)özellikle linq içinde bir boş boole değerlendirmek için çalışırken meşru bir seçenek olduğunu düşünüyorum .

Örneğin:
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)

Bence aksine daha temiz:
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)


1

Eğer sadece teste istiyorsanız truekarşı da null/ falseOne Sadece kullanılan ve oldukça iyi okur olduğunu ettik

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

1
Burada null referans istisnası almıyor musunuz?
Chase Florell

@ChaseFlorell VS Etkileşimli pencerede bunu iki kez kontrol etmek zorunda kaldım .. Hatırlanması gereken şey, koşulun türünün Nullable <bool> olması. , ama Değeri
ds4940

ilginç, şimdi görebiliyorum. Referans türleri için hala kabataslak dotnetfiddle.net/8cAI21
Chase Florell

0

Sanırım bu size bağlı. Kesinlikle .HasValue yaklaşımı, özellikle aşina olmayan geliştiriciler ile daha okunabilir olduğunu düşünüyorum ?? sözdizimi.

Null olabilecek bir boole türünün diğer noktası, tristat olmasıdır, bu nedenle sadece null olduğunda ve varsayılanı false olarak değilken başka bir şey yapmak isteyebilirsiniz.


0

Enum verildi

public enum PublishMode { Edit, View }

burada olduğu gibi yapabilirsin

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

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

Özellikle ilgili olan sorunun cevabı değil nullable boolean.
ToolmakerSteve

0

Koşulun bir kısmının boş değerli bir değeri kontrol edip etmediğini kontrol edemediğiniz bir durumdaysanız, her zaman aşağıdakileri deneyebilirsiniz:

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

Üçlü bir if deyimine koyarak saf bir yaklaşım olmadığını biliyorum ama sorunu temiz bir şekilde çözüyor.

Tabii ki bu el ile söylemenin bir yolu GetValueOrDefault(false)


3
OP'de sağlanan çözüm aynı şeydir, ancak çok daha az kod şişmesi ile. Bu hiç de avantajlı değil.
Servy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.