safety operator operador evaluar c# c#-6.0 null-propagation-operator

operator - null safety c#



Comprobación nula monádica en C#6.0 (3)

Me encontré con un sitio interesante, donde se abordan algunas de las características nuevas (propuestas) de C # 6.0. Puedes leerlo aquí: Características probables de C # 6.0 .

Lo que encuentro particularmente interesante es la comprobación nula monádica (también conocida como el operador de propagación nula ? ). Según el sitio, la siguiente declaración

var bestValue = points?.FirstOrDefault()?.X ?? -1;

contiene la comprobación nula monádica, que actualmente se implementa con este fragmento de código:

if (points != null) { var next = points.FirstOrDefault(); if (next != null && next.X != null) return next.X; } return -1;

Mi primera mirada fue, hey, ¿qué diablos está escrito aquí? Pero después de mirar el código ''antiguo'', me está empezando a gustar.

Sin embargo, también estoy empezando a recibir algunas preguntas, que me gustaría preguntar.

  • Supongo que este operador de propagación nula es seguro para subprocesos. Pero, ¿cómo se realiza realmente? ¿Se eliminarán las condiciones de la carrera o están persistiendo?
  • ¿Cómo manejaría este operador tipos genéricos? Además, ¿cómo trataría con los tipos genéricos no restringidos? Por ejemplo, considere

    var resultAfterNullCheck = x?.Y;

    Si el tipo Y aquí se crea una instancia con tipos de referencia, tipos de valores no anulables y tipos de valores anulables, no habría nada razonable que hacer (ya que no puedo pensar en qué hacer, ya que simplemente no sé qué hacer). Entonces, ¿hay un valor predeterminado que será devuelto? ¿O lanzará un error?

  • Al observar el ejemplo que proporciona el sitio (y que copié arriba), asumo que uno de los principales beneficios del operador de propagación nula será que evaluará la afirmación solo una vez. Sin embargo (tal vez debido a mi falta de conocimiento de CLR), tengo bastante curiosidad sobre cómo podría realizarse.
    En cuanto a mí, la primera evaluación (si los puntos son nulos) debería activar el método de extensión FirstOrDefault () para que se dispare cuando los puntos no son nulos, seguido de que la evalación del tipo devuelto sea nula o no, si no, X será devuelto Entonces, ¿estas son, de hecho, tres evaluaciones combinadas en una? ¿O lo estoy entendiendo incorrectamente? ¿Esto afectará la velocidad de ejecución?

En otras palabras, ¿qué será más rápido, la antigua forma de realizar comprobaciones nulas o este nuevo operador encantador? Intentaré examinar esto realizando una investigación tan pronto como finalice la descarga de Visual Studio 2015 ... Pero eso requiere un poco de paciencia ...

¿Hay alguna idea sobre este nuevo tipo de operador? ¿Es realmente aún una propuesta, o podemos realmente esperar trabajar con esta nueva comprobación nula monádica?

EDITAR
Como Matthew Watson proporcionó un buen artículo de MSDN sobre este (y más) tema (s), tenía curiosidad si mencionaba mi pregunta anterior con respecto a los genéricos no restringidos y cómo este operador se ocupa de eso. Desafortunadamente, no he encontrado una respuesta todavía. Si bien supongo que el programador debería intentar evitar el uso de genéricos sin restricciones, todavía puedo imaginar que a veces esto no es posible. Si ese es el caso, ¿será realmente necesario un rediseño?


Estás pensando demasiado en esto. Una por una, sus preguntas:

  1. ¿Por qué asumirías que es seguro para los hilos? Llamar a una función miembro no lo es. Esto no es más que llamar a una función miembro con una comprobación previa de nulos, por lo que solo obtiene la seguridad de subprocesos que la función original garantiza.

  2. Si su tipo genérico permite una comparación nula (que es lo que este operador usará entre bambalinas), se emitirá el código. Si no, obtendrá un error de compilación (por ejemplo, si necesita que el tipo sea un tipo de valor). Eso cubre todos los casos!

  3. Se llama una vez - por operador, al igual que lo normal . operador. Si dice Abc , todavía habrá dos niveles de direccionamiento indirecto, y usar este nuevo operador no es nada diferente, solo verifica si hay nulos.

Los verdaderos beneficios de ?. es que es semántico (puede decir de un vistazo lo que su código está tratando de hacer) y cortocircuito (hace que el código sea mucho más corto que el anidado if es s). No vas a reemplazar cada uno . en su antiguo código con ?. De hecho, es probable que rara vez lo uses. Pero hay casos en los que será útil, como en las expresiones Linq que siguen a ...OrDefault() o eventos de llamada.


Para responder parcialmente a su primera pregunta, según John Skeet en su blog , ¿el operador condicional nulo ?. (= operador de propagación nula) es seguro para subprocesos.