Corrió a través de 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.
c#
null-coalescing-operator
Edward Tanguay
fuente
fuente
Respuestas:
Es el operador de fusión nula, y bastante parecido al operador ternario (inmediato si). Ver también ?? Operador - MSDN .
se expande a:
que se expande aún más a:
En inglés, significa "Si lo que está a la izquierda no es nulo, úselo, de lo contrario use lo que está a la derecha".
Tenga en cuenta que puede usar cualquier número de estos en secuencia. La siguiente instrucción asignará la primera no nula
Answer#
aAnswer
(si todas las respuestas son nulas, entonces laAnswer
es nula):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. (Gracias a @Joey por señalar esto).
fuente
??
se deja asociativo, por lo quea ?? b ?? c ?? d
es equivalente a((a ?? b) ?? c ) ?? d
. "Los operadores de asignación y el operador ternario (? :) son asociativos correctos. Todos los demás operadores binarios quedan asociativos". Fuente: msdn.microsoft.com/en-us/library/ms173145.aspxSolo porque nadie más ha dicho las palabras mágicas todavía: es el operador de fusión nulo . Está definido 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:
dará el resultado de la expresión
a
si no es nulo, de lo contrario intenteb
, de lo contrario intentec
, de lo contrario intented
. Cortocircuita en cada punto.Además, si el tipo de
d
no es anulable, el tipo de la expresión completa tampoco lo es.fuente
Es el operador de fusión 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 genial de otra pregunta. Puedes encadenarlos.
¿Características ocultas de C #?
fuente
Gracias a todos, aquí está la explicación más sucinta que encontré en el sitio de MSDN:
fuente
-1
es simplemente un simpleint
, que no es anulable).x
es de tipoint?
, peroy
es de tipoint
, podría escribirint y = (int)(x ?? -1)
. Se analizaráx
a unint
si no esnull
, o se asignará-1
ay
six
esnull
.??
está ahí para proporcionar un valor para un tipo anulable cuando el valor es nulo. Entonces, si formAuth es nulo, devolverá nuevo FormsAuthenticationWrapper ().fuente
Los dos signos de interrogación (??) indican que es un operador de fusión.
El operador coalescente devuelve el primer valor NO NULL de una cadena. Puedes ver este video de youtube que demuestra prácticamente todo.
Pero déjenme agregar más a lo que dice el video.
Si ve el significado en inglés de fusión, dice "consolidar juntos". Por ejemplo, a continuación se muestra un código de fusión simple que encadena cuatro cadenas.
Así que si
str1
esnull
que va a tratarstr2
, sistr2
esnull
que va a tratarstr3
y así sucesivamente hasta que encuentra una cadena con un valor no nulo.En palabras simples, el operador de fusión devuelve el primer valor NO NULL de una cadena.
fuente
Es una mano corta para el operador ternario.
O para aquellos que no hacen ternary:
fuente
!= null
) como la segundaformsAuth
(después de la?
) podrían modificarse; en la forma de fusión nula, ambos toman implícitamente los valores que ha proporcionado.Si estás familiarizado con Ruby, me
||=
parece similar a C #??
. Aquí hay un poco de Ruby:Y en C #:
fuente
x ||= y
se desugará a algo asíx = x || y
, por??
lo que en realidad es más similar a la simple||
en Ruby.??
sólo se preocupanull
, mientras que el||
operador de Ruby, al igual que en la mayoría de lenguajes, es más acerca denull
,false
o todo lo que puede ser considerado como un booleano con un valor defalse
(por ejemplo, en algunos idiomas,""
). Esto no es algo bueno o malo, simplemente una diferencia.operador coalescente
es equivalente a
fuente
Nada peligroso sobre esto. De hecho, es hermoso. Puede agregar valor predeterminado si eso es conveniente, por ejemplo:
CÓDIGO
fuente
int? x1 = null;
¿Es correctox1
-x4
DEBE ser tipos anulables: no tiene sentido decir, efectivamente, "el resultado es0
six4
es un valor que no puede tomar" (null
). El "tipo anulable" aquí incluye tanto los tipos de valores anulables como los tipos de referencia, por supuesto. Es un error en tiempo de compilación si una o más de las variables encadenadas (excepto la última) no son anulables.Como se señaló correctamente en numerosas respuestas, ese es el "operador de fusión nula" ( ?? ), hablando de lo cual es posible que también desee consultar a su primo el "Operador condicional nulo" ( ?. O ? [ ) Que es un operador que muchas veces se usa junto con ??
Operador condicional nulo
Por ejemplo:
a la antigua usanza sin ? y ?? de hacer esto es
que es más detallado y engorroso.
fuente
Solo para su diversión (sabiendo que son todos C # chicos ;-).
Creo que se originó en Smalltalk, donde ha existido durante muchos años. Se define allí como:
en objeto:
en UndefinedObject (también conocido como clase nula):
Hay versiones de evaluación (?) Y no evaluables (??) de esto.
A menudo se encuentra en métodos getter para variables privadas (instancia) de inicialización lenta, que se dejan en cero hasta que realmente se necesitan.
fuente
Algunos de los ejemplos aquí de obtener valores utilizando la fusión son ineficientes.
Lo que realmente quieres es:
o
Esto evita que el objeto se vuelva a crear cada vez. En lugar de que la variable privada permanezca nula y se cree un nuevo objeto en cada solicitud, esto garantiza que la variable privada se asigne si se crea el nuevo objeto.
fuente
??
evalúa el atajo?new FormsAuthenticationWrapper();
se evalúa si y solo si_formsAuthWrapper
es nulo.Nota:
He leído todo este hilo y muchos otros, pero no puedo encontrar una respuesta tan completa como esta.
Por lo cual entendí completamente el "¿por qué usar ?? y cuándo usar ?? y cómo usar ??".
Fuente:
Base de comunicación de Windows desatada por Craig McMurtry ISBN 0-672-32948-4
Tipos de valores anulables
Hay dos circunstancias comunes en las que uno quisiera saber si un valor ha sido asignado a una instancia de un tipo de valor. La primera es cuando la instancia representa un valor en una base de datos. En tal caso, a uno le gustaría poder examinar la instancia para determinar si un valor está realmente presente en la base de datos. La otra circunstancia, que es más pertinente al tema de este libro, es cuando la instancia representa un elemento de datos recibido de alguna fuente remota. Nuevamente, uno quisiera determinar a partir de la instancia si se recibió un valor para ese elemento de datos.
.NET Framework 2.0 incorpora una definición de tipo genérico que proporciona casos como estos en los que se desea asignar un valor nulo a una instancia de un tipo de valor y comprobar si el valor de la instancia es nulo. Esa definición de tipo genérico es System.Nullable, que restringe los argumentos de tipo genérico que pueden ser sustituidos por T a los tipos de valor. Las instancias de tipos construidos a partir de System.Nullable pueden tener asignado un valor nulo; de hecho, sus valores son nulos por defecto. Por lo tanto, los tipos construidos a partir de System.Nullable pueden denominarse tipos de valor anulables. System.Nullable tiene una propiedad, Value, por la cual el valor asignado a una instancia de un tipo construido a partir de él se puede obtener si el valor de la instancia no es nulo. Por lo tanto, uno puede escribir:
El lenguaje de programación C # proporciona una sintaxis abreviada para declarar tipos construidos a partir de System.Nullable. Esa sintaxis permite abreviar:
a
El compilador evitará que uno intente asignar el valor de un tipo de valor anulable a un tipo de valor ordinario de esta manera:
Impide que uno lo haga porque el tipo de valor anulable podría tener el valor nulo, que en realidad tendría en este caso, y ese valor no puede asignarse a un tipo de valor ordinario. Aunque el compilador permitiría este código,
La segunda declaración provocaría una excepción porque cualquier intento de acceder a la propiedad System.Nullable.Value es una operación no válida si al tipo construido a partir de System.Nullable no se le ha asignado un valor válido de T, lo que no ha sucedido en este caso.
Conclusión:
Una forma adecuada de asignar el valor de un tipo de valor anulable a un tipo de valor ordinario es usar la propiedad System.Nullable.HasValue para determinar si se ha asignado un valor válido de T al tipo de valor anulable:
Otra opción es usar esta sintaxis:
Por el cual se asigna al entero común myInteger el valor del entero anulable "myNullableInteger" si a este último se le ha asignado un valor entero válido; de lo contrario, myInteger tiene asignado el valor de -1.
fuente
Es un operador de fusión nula que funciona de manera similar a un operador ternario.
Otro punto interesante para esto es, "Un tipo anulable puede contener un valor, o puede ser indefinido" . Entonces, si intenta asignar un tipo de valor anulable a un tipo de valor no anulable, obtendrá un error en tiempo de compilación.
¿Para hacer eso usando? operador:
fuente
es equivalente a
Pero lo bueno de esto es que puedes encadenarlos, como dijeron otras personas. Lo único que no se menciona es que en realidad puedes usarlo para lanzar una excepción.
fuente
El
??
operador se llama operador de fusión nula. Devuelve el operando de la izquierda si el operando no es nulo; de lo contrario, devuelve el operando de la derecha.Establezca
variable2
el valor devariable1
, sivariable1
NO es nulo; de lo contrario, si sevariable1 == null
establecevariable2
en 100.fuente
Otros han descrito lo
Null Coalescing Operator
bastante bien. Para aquellos interesados, hay una sintaxis abreviada donde esta (la pregunta SO):FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
es equivalente a esto:
FormsAuth ??= new FormsAuthenticationWrapper();
Algunos lo encuentran más legible y sucinto.
fuente