276 votos

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

En NET, lo que es la diferencia entre String.Empty y "" , y son intercambiables, o hay algunos problemas subyacentes de referencia o de localización alrededor de la igualdad que String.Empty lo hará asegurar que no son un problema?

282voto

Brian R. Bondy Puntos 141769

En .Net pre 2.0, "" crea un objeto mientras String.Empty crea ningún objeto. Así que es más eficaz el uso de Cadena.vacío.

Fuente de información

.Length == 0 es la opción más rápida, pero .Empty hace un poco de código más limpia.

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

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

Ver el .Net especificación para obtener más información.

186voto

Habib Puntos 93087

¿cuál es la diferencia entre Cadena.vacío 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 forma diferente:

Valor de Parámetro predeterminado 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
}

El caso de la expresión en la sentencia switch

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

    case "":
        break;

}

Los argumentos de 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 son correctas para .NET 1.1 (mira la fecha del post que enlaza: 2003). Como de .NET 2.0 y posteriores, no hay prácticamente ninguna diferencia. El JIT va a terminar haciendo referencia al mismo objeto en el montón, de todos modos.

De acuerdo con el C# especificación de la sección 2.4.4.5: http://msdn.microsoft.com/en-us/library/aa691090(VS.71).aspx

Cada cadena literal no se traduce necesariamente en una nueva instancia de string. Cuando dos o más literales de cadena que son equivalentes de acuerdo a la cadena de operador de igualdad (Artículo 7.9.7) aparecen en la misma asamblea, estos literales de cadena se refieren a la misma instancia de string.

Incluso alguien la menciona esto en los comentarios de Brad Abram post

En resumen, el resultado práctico de la "a" vs. Cadena.vacío es nula. El JIT habrá que averiguarlo en la final.

He encontrado que, personalmente, que el JIT es mucho más inteligente que yo y por eso trato de no ser demasiado inteligente con micro-optimizaciones del compilador como eso. El JIT se desarrollan para la() de bucles, eliminar código redundante, los métodos, etc mejor y en un momento más apropiado que yo o el compilador de C# nunca podría anticipar antes de mano. Deje que el JIT hacer 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 usted no puede utilizar String.Empty en una sentencia switch, porque no es una constante.

13voto

Eugene Katz Puntos 2784

Las respuestas anteriores son técnicamente correcto, pero lo que realmente lo desea, puede utilizar, para la 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