Considere el siguiente escenario típico:
if(myObject == null) {
myObject = new myClass();
}
Me pregunto qué se piensa del siguiente reemplazo usando el operador de fusión nula:
myObject = myObject ?? new myClass();
No estoy seguro de si debería estar usando la segunda forma. Parece una buena taquigrafía, pero la myObject = myObjectconstrucción al principio parece que podría ser un poco de olor a código.
¿Es esto algo razonable de hacer, o hay una mejor taquigrafía que me estoy perdiendo? O tal vez, "¡Son tres líneas, supéralo!"
Editar: Como se ha mencionado, quizás llamar a esto un escenario típico es una exageración. Por lo general, encuentro que me encuentro con esta situación cuando estoy recuperando una entidad de una base de datos que tiene una propiedad de tipo de referencia secundaria que puede o no estar poblada todavía:
myClass myObject = myClassService.getById(id);
myObject.myChildObject = myObject.myChildObject ?? new myChildClass();

MyClassdebe proporcionar unpublic static readonlymiembro de unEmptyvalor de su tipo. VerString.Emptyen MSDN .??=operador?Respuestas:
Yo uso el operador de fusión nula todo el tiempo. Me gusta su concisión.
Encuentro que este operador es similar en naturaleza al operador ternario (A? B: C). Se necesita un poco de práctica antes de leerlo, es una segunda naturaleza, pero una vez que está acostumbrado, siento que la legibilidad mejora con respecto a las versiones manuales.
Además, la situación que describe es solo un escenario en el que el operador es útil. También es útil para reemplazar construcciones como esta:
o
con
fuente
myObject = myObject2 ?? myObject3. Lo que me pregunto específicamente es usar el operador para establecer un objeto en sí mismo a menos que sea nulo.nullera una comparación.El
?? operatorse llama operador de fusión nula y se utiliza para definir un valor predeterminado para los tipos de valores anulables o tipos de referencia. Devuelve el operando de la izquierda si el operando no es nulo; de lo contrario, devuelve el operando correcto.myObject = myObject ?? new myObject();-instantiate default value of objectMás detalles y muestra de código sobre el operador de fusión nula - Artículo de MSDN .
Si verifica la
more than nullablecondición, como alternativa , puede utilizar el operador ternario.Operador ternario
También puede mirar ?: Operador . Se llama operador ternario u condicional . El operador condicional (? :) devuelve uno de los dos valores según el valor de una expresión booleana.
Un ejemplo de código de MSDN -?: Operador (Referencia de C #) :
fuente
myObject = (myObject == null) ? new myClass() : myObject. Entonces, a menos que me falte un mejor uso del operador condicional, parece tener el mismo "problema" al establecer un objeto en sí mismo (si no es nulo) que el operador de fusión nula, y es menos conciso.No creo que ese escenario sea (o al menos debería ser) típico.
Si desea que el valor predeterminado de algún campo no sea
null, configúrelo en el inicializador de campo:O, si la inicialización es más complicada, configúrela en el constructor.
Si desea crear
myClasssolo cuando realmente lo necesita (por ejemplo, porque crearlo lleva mucho tiempo), puede usarLazy<T>:(Esto llama al constructor predeterminado. Si la inicialización es más complicada, pase lambda que crea
myClassalLazy<T>constructor).Para acceder al valor, use
myObject.Value, que llamará a la inicialización si es la primera vez que accedemyObject.Value.fuente
Especialmente me gusta usar
??junto con parámetros de métodos opcionales. Limito la necesidad de sobrecargas y me aseguro de que la cosa tenga un valor.fuente