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 = myObject
construcció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();
MyClass
debe proporcionar unpublic static readonly
miembro de unEmpty
valor de su tipo. VerString.Empty
en 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.null
era una comparación.El
?? operator
se 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 object
Más detalles y muestra de código sobre el operador de fusión nula - Artículo de MSDN .
Si verifica la
more than nullable
condició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
myClass
solo 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
myClass
alLazy<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