Pregunta ¿Qué significan dos signos de interrogación juntos en C #?


Corrió a través de esta línea de código:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

¿Qué significan los dos signos de interrogación, es una especie de operador ternario? Es difícil buscar en Google.


1319
2018-01-15 14:03


origen


Respuestas:


Es el operador coalescente nulo, y bastante parecido al operador ternario (inmediato si). Ver también ?? Operador - MSDN.

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

se expande a:

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

que además se expande a:

if(formsAuth != null)
    FormsAuth = formsAuth;
else
    FormsAuth = new FormsAuthenticationWrapper();

En inglés, significa "Si lo que sea a la izquierda no es nulo, úsalo, de lo contrario usa lo que está a la derecha".

Tenga en cuenta que puede usar cualquier cantidad de estos en secuencia. La siguiente declaración asignará la primera no nula Answer# a Answer (si todas las respuestas son nulas, entonces el Answer es nulo):

string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;

También vale la pena mencionar que aunque 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).


1801
2018-01-15 14:04



Solo 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 prueba bDe lo contrario, intente cDe lo contrario, intente d. Se cortocircuita en cada punto.

Además, si el tipo de d no puede contener nulos, el tipo de la expresión completa tampoco es nulable.


232
2018-01-15 14:07



Es el operador coalescente nulo.

http://msdn.microsoft.com/en-us/library/ms173224.aspx

Sí, casi imposible de buscar a menos que sepa cómo se llama. :-)

EDITAR: Y esta es una característica interesante de otra pregunta. Puedes encadenarlos.

Características ocultas de C #?


64
2018-01-15 14:05



Gracias a todos, esta es 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;

21
2018-01-15 14:09



?? está ahí para proporcionar un valor para un tipo anulable cuando el valor es nulo. Por lo tanto, si formsAuth es nulo, devolverá el nuevo FormsAuthenticationWrapper ().


16
2018-01-15 14:05



enter image description here

Los dos signos de interrogación (??) indican que es un operador Coalescente.

El operador coalescente devuelve el primer valor NON-NULL de una cadena. Puedes ver este video de Youtube que demuestra todo de manera práctica.

Pero déjame agregar más a lo que dice el video.

Si ves el significado en inglés de coalescer, dice "consolidar juntos". Por ejemplo, a continuación, se muestra un código coalescente simple que encadena cuatro cadenas.

Así que si str1 es null lo intentará str2, Si str2 es null lo intentará str3 y así sucesivamente hasta que encuentre una cadena con un valor no nulo.

string final = str1 ?? str2 ?? str3 ?? str4;

En palabras simples, el operador coalescente devuelve el primer valor NON-NULL de una cadena.


13
2017-12-16 10:30



Es mano corta para el operador ternario.

FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();

O para aquellos que no hacen ternario:

if (formsAuth != null)
{
  FormsAuth = formsAuth;
}
else
{
  FormsAuth = new FormsAuthenticationWrapper();
}

9
2018-01-15 14:05