Me preguntaba cuál era la sintaxis más limpia y comprensible para hacer verificaciones de condición en las boletas anulables.
¿Es el siguiente estilo de codificación bueno o malo? ¿Hay alguna manera de expresar la condición mejor / más limpiamente?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
especialmente la parte if (nullableBool ?? false) . No me gusta el if (x.HasValue && x.Value)
estilo ...
(no estoy seguro si la pregunta se ha hecho antes ... no se pudo encontrar algo similar con la búsqueda)
c#
coding-style
nullable
Serpiente de fuego
fuente
fuente
¿Qué tal usar GetValueOrDefault , que se explica por sí solo y permite usar el valor predeterminado que desee?
fuente
System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
Puede que no te guste, pero personalmente encuentro
El más legible. Deja en claro que está trabajando con un tipo anulable y deja en claro que primero está verificando si el tipo anulable tiene un valor antes de actuar condicionalmente.
Si toma su versión y reemplaza la variable con x también se lee:
¿Está eso tan claro? ¿Es obvio que x es un tipo anulable? Te dejaré decidir.
fuente
x
está bien en contexto y a veces es más limpio; a saber:var openOrders = orders.Where(x=>x.Open ?? false)
Si desea tratar un
null
como falso, entonces diría que la forma más sucinta de hacerlo es usar el operador de fusión nula (??
), como usted describe:fuente
Solo piensa en bool? teniendo 3 valores, entonces las cosas se vuelven más fáciles:
fuente
Usa extensiones.
fuente
null
comotrue
?Veamos cómo se define la comparación con nulo:
y los resultados son:
Para que pueda usar con seguridad:
fuente
if(nullable)...else if(!nulllable)...else..
En realidad, creo que
(nullableBool ?? false)
es una opción legítima, especialmente cuando intentas evaluar un bool anulable en linq.Por ejemplo:
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)
Es más limpio en mi opinión en lugar de:
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)
fuente
Si solo quieres probar
true
contranull
/false
, uno que acabo de usar y lee bastante bien esfuente
Creo que depende de ti. Ciertamente creo que el enfoque .HasValue es más legible, especialmente con los desarrolladores que no están familiarizados con el ?? sintaxis.
El otro punto de un tipo booleano anulable es que es triestado, por lo que es posible que desee hacer algo más cuando es simplemente nulo y no predeterminado a falso.
fuente
Enum dado
puedes hacerlo como aquí
fuente
nullable boolean
.Si se encuentra en una situación en la que no tiene control sobre si parte de la condición está verificando un valor anulable, siempre puede intentar lo siguiente:
Sé que no es exactamente un enfoque purista poner un ternario en una declaración if, pero resuelve el problema limpiamente.
Esta es, por supuesto, una forma manual de decir
GetValueOrDefault(false)
fuente