276 votos

¿Cuál es la diferencia entre String.Empty y "" (cadena vacía)?

En .NET, ¿cuál es la diferencia entre String.Empty y "" y son intercambiables, o hay alguna referencia subyacente o cuestiones de localización en torno a la igualdad que String.Empty ¿se asegurará de que no sea un problema?

282voto

Brian R. Bondy Puntos 141769

En .Net pre 2.0, "" crea un objeto mientras que String.Empty no crea ningún objeto. Así que es más eficiente utilizar String.Empty.

Fuente de información

.Length == 0 es la opción más rápida, pero .Empty hace que el código sea un poco más limpio.

Como mencionó @chadmyers, en la versión 2.0 y superiores de .Net, todas las apariciones de "" se refieren a la misma cadena literal.

Así que "" es bastante equivalente a .Empty pero todavía no es tan rápido como .Length == 0 .

Ver el Para más información, consulte la especificación .Net .

186voto

Habib Puntos 93087

¿Cuál es la diferencia entre String.Empty y "", y son intercambiables

string.Empty es un campo de sólo lectura mientras que "" es una constante en tiempo de compilación. Los lugares donde se comportan de manera diferente son:

Valor del parámetro por defecto en C# 4.0 o superior

void SomeMethod(int ID, string value = string.Empty)
// Error: Default parameter value for 'value' must be a compile-time constant
{
    //... implementation
}

Expresión case en la sentencia switch

string str = "";
switch(str)
{
    case string.Empty: // Error: A constant value is expected. 
        break;

    case "":
        break;

}

Argumentos de los atributos

[Example(String.Empty)]
// Error: An attribute argument must be a constant expression, typeof expression 
//        or array creation expression of an attribute parameter type

38voto

chadmyers Puntos 3010

Las respuestas anteriores eran correctas para .NET 1.1 (mira la fecha del post que enlazaron: 2003). A partir de .NET 2.0 y posteriores, no hay esencialmente ninguna diferencia. El JIT acabará haciendo referencia al mismo objeto en el montón de todas formas.

Según la especificación de C#, sección 2.4.4.5: http://msdn.microsoft.com/en-us/library/aa691090(VS.71).aspx

Cada literal de cadena no da lugar necesariamente a una nueva instancia de cadena. Cuando dos o más literales de cadena que son equivalentes según el operador de igualdad de cadenas (Sección 7.9.7) aparecen en el mismo conjunto, estos literales de cadena se refieren a la misma instancia de cadena.

Alguien incluso lo menciona en los comentarios del post de Brad Abram

En resumen, el resultado práctico de "" frente a String.Empty es nulo. El JIT lo resolverá al final.

Personalmente, he comprobado que el JIT es mucho más inteligente que yo, por lo que intento no pasarme de listo con optimizaciones del microcompilador de este tipo. El JIT desplegará los bucles for(), eliminará el código redundante, los métodos inline, etc. mejor y en momentos más adecuados de lo que yo o el compilador de C# podríamos prever de antemano. Dejemos que el JIT haga su trabajo :)

35voto

James Newton-King Puntos 13880

String.Empty es un campo de sólo lectura mientras que "" es una constante. Esto significa que no se puede utilizar String.Empty en una sentencia switch porque no es una constante.

13voto

Eugene Katz Puntos 2784

Las respuestas anteriores son técnicamente correctas, pero lo que realmente se debe utilizar, para una mejor legibilidad del código y la menor posibilidad de una excepción es String.IsNullOrEmpty(s)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X