ternario operator operador con busqueda c# c#-6.0 null-conditional-operator

c# - operator - Uso del operador condicional nulo para verificar valores en objetos que podrían ser nulos



operador en c# (3)

Se corta la llamada a Bar.

significa dejar de verificar los siguientes pasos ( . ) dentro de una cadena de referencia de objetos si el elemento principal ya es nulo. Esto significa que los operadores, como una comparación, no se ven afectados porque está utilizando el valor en lugar de moverse en la cadena . Este comportamiento se llama propagación nula. Puedes encontrar algunas descripciones agradables en Code Project o Dave Fancher .

¿Usar el operador condicional nulo devuelve un valor anulable como double? . Este valor se compara entonces con max . El comportamiento de un nulo en dicha comparación está bien descrito por Microsoft :

Cuando realiza comparaciones con tipos anulables, si el valor de uno de los tipos anulables es nulo y el otro no, todas las comparaciones se evalúan como falsas a excepción de! = (No igual).

Esto significa:

if (null > max) { //never called }

He estado jugando con el Operador Condicional Nulo de C # 6 ( más información aquí ).

Realmente me gusta la sintaxis y creo que hace que el código sea mucho más legible, sin embargo, creo que es cuestionable qué hará exactamente el código cuando se encuentre con la verificación del valor de una propiedad en un objeto que, en sí mismo, podría ser nulo.

Por ejemplo, si tuviera una clase con una propiedad decimal y quisiera una verificación condicional del valor de ese decimal, escribiría algo como:

if (foo?.Bar > max) { // do something }

En la superficie, esto se ve muy bien ... Si foo no es nulo, obtenga el valor de Bar y compruebe si es mayor que un valor máximo, si lo es, haga algo.

Sin embargo, ¿qué pasa si foo es nulo?

Esta documentación sobre las características nuevas y mejoradas de C # 6 dice algo en estas líneas:

si de hecho el valor del objeto es nulo, el operador condicional nulo devolverá nulo. Hace un cortocircuito en la llamada a la barra y devuelve inmediatamente el valor nulo, evitando el error de programación que de lo contrario daría lugar a una NullReferenceException

He escrito un violín here que muestra que sí funciona y que está haciendo lo que esperaba que hiciera, sin embargo no puedo entender cómo está decidiendo el resultado de la enfermedad.

¿Cómo el cortocircuito es igual a falso ? En mi cabeza, este código ahora dirá "Si foo es nulo, verifica si nulo es> máximo, lo que es imposible, entonces devuelve falso" o "Si foo es nulo, entonces foo! = Null devolverá falso, así que obtienes un falso "sin embargo, la documentación dice que la comprobación condicional nula devuelve nulo, no falso.



El Null Conditional Operator debe usar solo para los escenarios relacionados con las múltiples asignaciones de propiedades de objetos (consulte la asignación de objetos, etc.) donde podría ser aburrido verificar siempre que ocurra la condición nula de la propiedad.

O también para escenarios como los siguientes:

int? count = customers?[0]?.Orders?.Count(); // null if customers, the first customer, or Orders is null

Al utilizar este operador en una expresión de prueba if , podría llevar a comportamientos inesperados, por ejemplo, en su here se obtiene una prueba "aprobada" (la última instrucción if ), pero con un valor null , que obviamente no es un caso válido.