Zastanawiałem się, jaka była najbardziej czysta i zrozumiała składnia do sprawdzania warunków na zerowalnych wartościach logicznych.
Czy następujący dobry lub zły styl kodowania? Czy istnieje sposób, aby lepiej / bardziej wyrazić ten stan?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
szczególnie część if (nullableBool ?? false) . Nie podoba mi się if (x.HasValue && x.Value)
styl ...
(nie jestem pewien, czy pytanie zostało zadane wcześniej ... nie można znaleźć czegoś podobnego przy wyszukiwaniu)
c#
coding-style
nullable
FireSnake
źródło
źródło
Co powiesz na użycie GetValueOrDefault , która jest dość intuicyjna i pozwala na użycie dowolnej domyślnej wartości:
źródło
System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
Może ci się to nie podobać, ale osobiście uważam
najbardziej czytelny. Wyjaśnia, że pracujesz z typem zerowalnym i wyjaśnia, że najpierw sprawdzasz, czy typ zerowalny ma wartość, zanim zaczniesz działać na nim warunkowo.
Jeśli weźmiesz swoją wersję i zamienisz zmienną na x, to będzie ona brzmiała:
Czy to tak jasne? Czy to oczywiste, że x jest typem zerowalnym? Pozwolę ci zdecydować.
źródło
x
jest w porządku i czasami jest czystszy; tovar openOrders = orders.Where(x=>x.Open ?? false)
Jeśli chcesz traktować
null
jako fałsz, powiedziałbym, że najbardziej zwięzłym sposobem na to jest użycie operatora zerowej koalescencji (??
), jak to opisano:źródło
Pomyśl o bool? ponieważ mają 3 wartości, to staje się łatwiejsze:
źródło
Użyj rozszerzeń.
źródło
null
zatrue
?Pozwala sprawdzić, jak zdefiniowane jest porównanie z wartością null:
a wyniki to:
Możesz więc bezpiecznie używać:
źródło
if(nullable)...else if(!nulllable)...else..
Właściwie uważam, że
(nullableBool ?? false)
jest to uzasadniona opcja, zwłaszcza gdy próbujesz ocenić zerowalne bool w linq.Na przykład:
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)
Moim zdaniem jest czystszy w przeciwieństwie do:
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)
źródło
Jeśli chcesz testować tylko
true
przeciwkonull
/false
, jest to jeden, którego właśnie użyłem i czyta całkiem dobrzeźródło
Myślę, że to zależy od ciebie. Z pewnością uważam, że podejście .HasValue jest bardziej czytelne, szczególnie w przypadku programistów nie znających ?? składnia.
Innym punktem zerowalnego typu logicznego jest to, że jest to tristate, więc możesz chcieć zrobić coś innego, gdy jest on po prostu zerowy, a domyślnie nie ma wartości false.
źródło
Biorąc pod uwagę wyliczenie
możesz to zrobić tak jak tutaj
źródło
nullable boolean
.Jeśli znajdujesz się w sytuacji, w której nie masz kontroli nad tym, czy część warunku sprawdza wartość zerowalną, zawsze możesz wypróbować następujące czynności:
Wiem, że to nie jest dokładnie purystyczne podejście do umieszczenia trójki w instrukcji if, ale rozwiązuje problem w czysty sposób.
Jest to oczywiście ręczny sposób powiedzenia
GetValueOrDefault(false)
źródło