2010-02-18 26 views
8

Duplicar posible:
What is the “??” operator for?¿Qué significa el símbolo <??> en C# .NET?

vi una línea de código que establece -

return (str ?? string.Empty).Replace(txtFind.Text, txtReplace.Text); 

Quiero saber el significado exacto de esta línea (es decir, el ?? parte) ..

+0

Siempre he aceptado esto como un reemplazo, pero nunca realmente entendí completamente de dónde vengo; –

+1

duplicado de http://stackoverflow.com/questions/827454/what-is-the-operator-for – tanascius

+0

Consulte la sección 7.12 de la especificación para obtener más información. –

Respuesta

19

Es el null coalescing operator: devuelve el primer argumento si no es nulo, y el segundo argumento de lo contrario. En su ejemplo, str ?? string.Empty se está utilizando esencialmente para intercambiar cadenas nulas por cadenas vacías.

Es particularmente útil con tipos anulable, ya que permite a un valor predeterminado que se especifica:

int? nullableInt = GetNullableInt(); 
int normalInt = nullableInt ?? 0; 

Editar:str ?? string.Empty puede reescribirse en términos del operador condicional como str != null ? str : string.Empty. Sin que el operador condicional, habría que utilizar una más prolija sentencia if, por ejemplo:

if (str == null) 
{ 
    str = string.Empty; 
} 

return str.Replace(txtFind.Text, txtReplace.Text); 
+0

¿Puedes explicar 'str ?? string.Empty' con una sintaxis detallada? Me refiero a reemplazar esta línea con una sintaxis detallada. :) –

+0

Entendido ... Gracias ... :) –

4

es un equiv alent de

(str == null ? string.Empty : str) 
+0

En este caso particular, sí, pero si sustituyes una expresión arbitraria por 'str' se vuelve más complicado, porque la expresión solo se evaluaría una vez. –

+0

Nunca he usado el operador nulo coalescente en ninguna configuración que no sea una simple como esta, así que no estoy seguro de lo que quiere decir. ¿Te importaría publicar un ejemplo de a qué te refieres? –

+1

Lo que Jon está diciendo es que si dices F() ?? G(), eso no es ** exactamente equivalente ** a (F() == nulo? G(): F()), porque esa cosa llama a F() dos veces. En realidad, es más como hacer una temperatura implícita = F() y luego calcular temp == nulo? G(): temp. Y en realidad eso tampoco está bien porque las cosas se complican según los tipos exactos de los dos lados del operador. Podríamos insertar moldes allí también. –

9

Se llama null coalescing operator. Le permite seleccionar condicionalmente primer valor no nulo de una cadena:

string name = null; 
string nickname = GetNickname(); // might return null 
string result = name ?? nickname ?? "<default>"; 

El valor en result va a ser el valor de nickname si no es nulo, o "<default>".

1
str ?? String.Empty 

podría escribirse como:

if (str == null) { 
    return String.Empty; 
} else { 
    return str; 
} 

o como una declaración ternaria:

str == null ? str : String.Empty; 
+0

Como Jon Skeet agregó a una respuesta anterior, su extracto solo es equivalente en casos simples: la expresión 'str' solo se evalúa una vez con el operador' ?? '. – Broam

3

¿El ?? el operador dice que devuélvame el valor no nulo. Por lo tanto, si usted tiene el siguiente código:

string firstName = null; 

string personName = firstName ?? "John Doe"; 

El código anterior devolverá "John Doe" ya que el valor primerNombre es nulo.

Eso es todo!