¿Qué significan dos signos de interrogación juntos en C#?
Me encontré con esta línea de código:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
¿Qué significan los dos signos de interrogación? ¿Es algún tipo de operador ternario? Es difícil buscar en Google.
Es el operador coalescente nulo y bastante parecido al operador ternario (si inmediato). Ver también ?? Operador - MSDN .
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
se expande a:
FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();
que se expande aún más a:
if(formsAuth != null)
FormsAuth = formsAuth;
else
FormsAuth = new FormsAuthenticationWrapper();
En inglés, significa "Si lo que está a la izquierda no es nulo, úsalo; de lo contrario, usa lo que está a la derecha".
Tenga en cuenta que puede utilizar cualquier número de estos en secuencia. La siguiente declaración asignará el primer no nulo Answer#
a Answer
(si todas las respuestas son nulas, entonces Answer
es nulo):
string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;
También vale la pena mencionar que si bien la expansión anterior es conceptualmente equivalente, el resultado de cada expresión solo se evalúa una vez. Esto es importante si, por ejemplo, una expresión es una llamada a un método con efectos secundarios. (Crédito a @Joey por señalar esto).
Sólo porque nadie más ha dicho las palabras mágicas todavía: es el operador coalescente nulo . Se define en la sección 7.12 de la especificación del lenguaje C# 3.0 .
Es muy útil, particularmente por la forma en que funciona cuando se usa varias veces en una expresión. Una expresión de la forma:
a ?? b ?? c ?? d
dará el resultado de la expresión a
si no es nulo; de lo contrario, intente b
, de lo contrario, intente c
, de lo contrario, intente d
. Se produce un cortocircuito en todos los puntos.
Además, si el tipo de d
no admite nulos, el tipo de toda la expresión también lo será.
Es el operador coalescente nulo.
http://msdn.microsoft.com/en-us/library/ms173224.aspx
Sí, ¡casi imposible de buscar a menos que sepas cómo se llama! :-)
EDITAR: Y esta es una característica interesante de otra pregunta. Puedes encadenarlos.
¿Características ocultas de C#?
Gracias a todos, aquí está la explicación más sucinta que encontré en el sitio de MSDN:
// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;