Saya bertanya-tanya apa sintaks yang paling bersih dan dapat dimengerti untuk melakukan pemeriksaan kondisi pada bools nullable.
Apakah gaya pengkodean baik atau buruk berikut? Apakah ada cara untuk mengekspresikan kondisi lebih baik / lebih bersih?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
terutama bagian if (nullableBool ?? false) . Saya tidak suka if (x.HasValue && x.Value)
gaya ...
(tidak yakin apakah pertanyaan telah diajukan sebelumnya ... tidak dapat menemukan sesuatu yang mirip dengan pencarian)
c#
coding-style
nullable
FireSnake
sumber
sumber
Bagaimana dengan menggunakan GetValueOrDefault , yang cukup menjelaskan sendiri dan memungkinkan untuk menggunakan default apa pun yang Anda inginkan:
sumber
System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
Anda mungkin tidak menyukainya, tetapi secara pribadi saya temukan
yang paling mudah dibaca. Itu membuat jelas Anda bekerja dengan tipe nullable dan membuatnya jelas Anda pertama kali memeriksa apakah tipe nullable memiliki nilai sebelum bertindak berdasarkan kondisional.
Jika Anda mengambil versi Anda dan mengganti variabel dengan x juga berbunyi:
Apakah itu jelas? Apakah jelas x adalah tipe yang dapat dibatalkan? Saya akan membiarkan Anda memutuskan.
sumber
x
baik dalam konteks dan terkadang lebih bersih; yakni:var openOrders = orders.Where(x=>x.Open ?? false)
Jika Anda ingin memperlakukan
null
sebagai salah, maka saya akan mengatakan bahwa cara paling ringkas untuk melakukannya adalah dengan menggunakan operator null coalesce (??
), seperti yang Anda jelaskan:sumber
Pikirkan bool saja? memiliki 3 nilai, maka segalanya menjadi lebih mudah:
sumber
Gunakan ekstensi.
sumber
null
sebagaitrue
?Mari kita periksa bagaimana perbandingan dengan null didefinisikan:
dan hasilnya adalah:
Jadi Anda dapat menggunakan:
sumber
if(nullable)...else if(!nulllable)...else..
Sebenarnya saya pikir itu
(nullableBool ?? false)
adalah pilihan yang sah terutama ketika Anda mencoba untuk mengevaluasi bool nullable di LINQ.Sebagai contoh:
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)
Lebih bersih menurut saya dibandingkan dengan:
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)
sumber
Jika Anda hanya ingin menguji untuk
true
menentangnull
/false
, Satu saya baru saja menggunakan dan membaca dengan baik adalahsumber
Saya pikir itu terserah Anda. Saya tentu berpikir pendekatan .HasValue lebih mudah dibaca, terutama dengan pengembang yang tidak terbiasa dengan ?? sintaksis.
Poin lain dari tipe boolean yang dapat dibatalkan adalah bahwa itu adalah tristate, jadi Anda mungkin ingin melakukan sesuatu yang lain ketika itu hanya nol, dan bukan default ke false.
sumber
Diberikan enum
Anda dapat melakukannya seperti di sini
sumber
nullable boolean
.Jika Anda berada dalam situasi di mana Anda tidak memiliki kendali atas apakah bagian dari kondisi memeriksa nilai yang dapat dibatalkan, Anda selalu dapat mencoba yang berikut ini:
Saya tahu ini bukan pendekatan murni yang menempatkan terner dalam pernyataan if tetapi itu menyelesaikan masalah dengan bersih.
Ini, tentu saja, cara mengatakan secara manual
GetValueOrDefault(false)
sumber