2010-09-22 38 views
8

Duplicar posible:
What do two question marks together mean in C#?¿Qué significa '??' significa en C#?

Estoy tratando de entender lo que hace este DECLARACIÓN: lo que hace "??" ¿media? es este tipo som si if-statment?

string cookieKey = "SearchDisplayType" + key ?? ""; 
+4

Si se pudiera buscar "??" en SO esto calificaría como un duplicado de, p. [esto] (http://stackoverflow.com/questions/770186/null-coalescing-operator-what-does-coalescing-mean). :-( –

+5

1. Inicie C#. 2. '??' 3. PROFIT! – leppie

+0

tenga cuidado debido a la prioridad de los operadores http://msdn.microsoft.com/en-us/library/6a71f45d.aspx – tom3k

Respuesta

14

Es el operador Null Coalescing. Significa que si la primera parte tiene valor, ese valor se devuelve; de ​​lo contrario, devuelve la segunda parte.

ej .:

object foo = null; 
object rar = "Hello"; 

object something = foo ?? rar; 
something == "Hello"; // true 

O algún código real:

IEnumerable<Customer> customers = GetCustomers(); 
IList<Customer> customerList = customers as IList<Customer> ?? 
    customers.ToList(); 

Lo que este ejemplo está haciendo es la fundición los clientes como IList<Customer>. Si esto arroja un resultado nulo, llamará al método LINQ ToList en el cliente IEnumerable.

La sentencia if comparable sería la siguiente:

IEnumerable<Customer> customers = GetCustomers(); 
IList<Customer> customersList = customers as IList<Customer>; 
if (customersList == null) 
{ 
    customersList = customers.ToList(); 
} 

Lo cual es una gran cantidad de código en comparación con hacerlo en una sola línea usando el operador nulo coalescencia.

+2

solo un punto -> no se puede hacer 'var foo = null;' – nothrow

+0

@Yossarian - Sí, buen punto, pero era solo pseudo código. Lo cambié para evitar confusiones. – GenericTypeTea

+0

@Yossarian - Puedes hacer 'var foo = (object) null;' o 'var foo = (SomeClass) null;' que ayudará ke Nombres de variables ep alineados y código fácil de leer. – Enigmativity

5

Es this. Bueno en realidad no.

En realidad, es this. Y this, this, this y this, por nombrar algunos. Usé todo el Google para encontrarlos, ya que SO no tiene una función para buscar en las respuestas (¿correcto?), Lo que hace difícil encontrar duplicados para este tipo de preguntas. Bueno, para el futuro, usa esto como referencia. ;-)

Se llama operador nulo-coalescente. Básicamente es lo mismo que

int? nullableDemoInteger; 
// ... 
int someValue = nullableDemoInteger ?? -1; 
// basically same as 
int someValue = nullableDemoInteger.HasValue ? nullableDemoInteger.Value : -1; 
// basically same as 
int someValue; 
if(nullableDemoInteger.HasValue) 
    someValue = nullableDemoInteger.Value; 
else 
    someValue = -1; 
+0

+1 el mejor uso de ?? es tipos anulables imo – abatishchev

1

Es el operador nulo-coalescente.

Esto significa que si key no es nulo, usa el valor de la clave, si la clave es nula, usa el valor "".

4

Es el null-coalescing operator.En este caso es más o menos equivalente a:

string cookieKey; 
string temp = "SearchDisplayType" + key; 
if (temp == null) 
    cookieKey = ""; 
else 
    cookieKey = temp; 

Y, puesto que no puede ser nunca "SearchDisplayType" + keynull, esto es exactamente equivalente a:

string cookieKey = "SearchDisplayType" + key; 
+0

+1. Pásame a eso. Solo responde hasta ahora que menciona la precedencia de '??' contra '+' y que es redundante en el ejemplo del PO. – Ani

+0

Incorrecto. If (clave == nulo) no if ("SearchDisplayType" + tecla) == nulo). – Goran

+0

@Goran: No, LukeH es correcto. Tal vez no sea intuitivo, pero pruébalo. – Ani

1

?? es el null-coalescing.

De MSDN:

El ?? el operador se llama operador nulo-coalescente y se usa para definir un valor predeterminado para los tipos de valores que aceptan nulos , así como los tipos de referencia . Devuelve el operando de la izquierda si no es nulo; de lo contrario, devuelve el operando correcto.

Tenga en cuenta, sin embargo, que en su caso la parte izquierda de la expresión no puede ser nula, porque es una concatenación de constante de cadena con una variable. Si la clave es nula, la clave "SearchDisplayType" + se evalúa como "SearchDisplayType".

supongo que la intención de su declaración podría ser implementado con:

string cookieKey = key==null ? "" : "SearchDisplayType"+key; 

utilizando este código, cookieKey se establece en una cadena vacía si la clave es nula, de lo contrario se pone a la concatenación de "SearchDisplayType" + clave