En .NET, ¿cuál es la diferencia entre String.Empty
y ""
, y son intercambiables, o hay alguna referencia subyacente o problemas de localización en torno a la igualdad que String.Empty
garanticen que no sea un problema?
.net
double-quotes
string
johnc
fuente
fuente
string.Empty
y cuál fue la razón detrás de declararlo enreadonly
lugar deconst
.Respuestas:
En .NET anterior a la versión 2.0,
""
crea un objeto mientrasstring.Empty
no crea ningún objeto ref , lo que hacestring.Empty
más eficiente.En la versión 2.0 y posterior de .NET, todas las apariciones se
""
refieren al mismo literal de cadena, lo que significa que""
es equivalente a.Empty
, pero aún no tan rápido como.Length == 0
..Length == 0
es la opción más rápida, pero.Empty
hace que el código sea un poco más limpio.Consulte la especificación .NET para obtener más información .
fuente
string.IsNullOrEmpty( stringVar )
.string.Empty
es un campo de solo lectura, mientras que""
es una constante de tiempo de compilación. Los lugares donde se comportan de manera diferente son:Valor de parámetro predeterminado en C # 4.0 o superior
Expresión de caso en la declaración de cambio
Argumentos de atributo
fuente
String.Empty
argumento como argumento en la mayoría de los casos. Tiene razón en que todos los ejemplos muestran esoyou simply can't put a (run-time) "value" into (compile-time) metadata
y eso es lo que los ejemplos pretenden mostrar.Las respuestas anteriores eran correctas para .NET 1.1 (mire la fecha de la publicación que vincularon: 2003). A partir de .NET 2.0 y versiones posteriores, esencialmente no hay diferencia. El JIT terminará haciendo referencia al mismo objeto en el montón de todos modos.
De acuerdo con la especificación C #, sección 2.4.4.5: http://msdn.microsoft.com/en-us/library/aa691090(VS.71).aspx
Alguien incluso menciona esto en los comentarios de la publicación de Brad Abram
En resumen, el resultado práctico de "" vs. String.Empty es nulo. El JIT lo resolverá al final.
Personalmente, he descubierto que el JIT es mucho más inteligente que yo, por lo que trato de no ser demasiado inteligente con optimizaciones de microcompiladores como esa. El JIT se desplegará para bucles (), eliminará código redundante, métodos en línea, etc. mejor y en momentos más apropiados de lo que yo o el compilador de C # podríamos anticipar de antemano. Deje que el JIT haga su trabajo :)
fuente
String.Empty
es un campo de solo lectura mientras que""
es una constante . Esto significa que no se puede usarString.Empty
en una declaración de cambio porque no es una constante.fuente
default
palabra clave podemos promover la legibilidad sin, evitar modificaciones accidentales y tener una constante de tiempo de compilación, aunque para ser honesto, sigo pensando que String.Empty es más legible que el predeterminado, pero más lento de escribirOtra diferencia es que String.Empty genera un código CIL más grande. Si bien el código para hacer referencia a "" y String.Empty tiene la misma longitud, el compilador no optimiza la concatenación de cadenas (consulte la publicación del blog de Eric Lippert ) para ver los argumentos de String.Empty. Las siguientes funciones equivalentes
generar esta IL
fuente
"bar " + (ok ? "" : "error")
Las respuestas anteriores son técnicamente correctas, pero lo que realmente desea usar, para una mejor legibilidad del código y la menor posibilidad de una excepción es String.IsNullOrEmpty (s)
fuente
--foo=$BAR
entonces probablemente desee detectar la diferencia entre ellos olvidando establecer una variable de env y que no pasen la bandera en absoluto.string.IsNullOrEmpty
A menudo es un olor a código que no ha validado sus entradas correctamente o está haciendo cosas raras. En general, no debe aceptar cadenas vacías cuando realmente quiere usarnull
, o algo así como un tipo Quizás / Opción.Tiendo a usarlo en
String.Empty
lugar de hacerlo""
por una razón simple, pero no obvia:""
y""
NO son lo mismo, el primero tiene 16 caracteres de ancho cero. Obviamente, ningún desarrollador competente va a poner caracteres de ancho cero en su código, pero si llegan allí, puede ser una pesadilla de mantenimiento.Notas:
Solía U + FEFF en este ejemplo.
No estoy seguro de si SO va a comer esos caracteres, pero pruébelo usted mismo con uno de los muchos caracteres de ancho cero
Solo encontré esto gracias a https://codegolf.stackexchange.com/
fuente
Usar en
String.Empty
lugar de""
.Referencia:
String.Empty
vs""
fuente
String.Empty no crea un objeto mientras que "" sí lo hace. Sin embargo, la diferencia, como se señala aquí , es trivial.
fuente
Todas las instancias de "" son el mismo literal de cadena interno (o deberían serlo). Por lo tanto, realmente no lanzará un nuevo objeto en el montón cada vez que use "", sino que simplemente cree una referencia al mismo objeto interno. Dicho esto, prefiero la cadena. Vacío. Creo que hace que el código sea más legible.
fuente
¡Simplemente no importa!
Alguna discusión pasada de esto:
http://www.codinghorror.com/blog/archives/000185.html
http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx
http://blogs.msdn.com/brada/archive/2003/04/27/50014.aspx
fuente
ldstr
empuja una nueva referencia de objeto a un literal de cadena almacenado en los metadatos.ldsfld
empuja el valor de un campo estático en la pila de evaluaciónTiendo a usar en
String.Empty
lugar de""
porque en mi humilde opinión es más claro y menos VB-ish.fuente
Aquí hay algunos resultados de Roslyn x64 a partir de enero de 2019. A pesar de las observaciones consensuadas de las otras respuestas en esta página, no me parece que el JIT x64 actual esté tratando todos estos casos de manera idéntica, cuando todo está dicho y hecho.
Sin embargo,
String.Concat
tenga en cuenta, en particular, que solo uno de estos ejemplos realmente termina llamando , y supongo que eso es por razones de corrección oscuras (en lugar de una supervisión de optimización). Las otras diferencias parecen más difíciles de explicar.default (String) + {default (String), "", String.Empty}
"" + {default (String), "", String.Empty}
String.Empty + {default (String), "", String.Empty}
Detalles de la prueba
fuente
Llegando a esto desde el punto de vista de Entity Framework: EF versiones 6.1.3 parece tratar String.Empty y "" de manera diferente al validar.
string.Empty se trata como un valor nulo para fines de validación y arrojará un error de validación si se usa en un campo Requerido (atribuido); donde como "" pasará la validación y no arrojará el error.
Este problema puede resolverse en EF 7+. Referencia: - https://github.com/aspnet/EntityFramework/issues/2610 ).
Editar: [Obligatorio (AllowEmptyStrings = true)] resolverá este problema, permitiendo que string.Empty se valide.
fuente
Como String.Empty no es una constante de tiempo de compilación, no puede usarlo como valor predeterminado en la definición de funciones.
fuente
public void test(int i=0, string s=string.Empty) {}
no se compilará y dirá "El valor del parámetro predeterminado para 's' debe ser una constante de tiempo de compilación. La respuesta de OP funciona.Cuando escanea visualmente a través del código, "" aparece coloreado de la misma forma que las cadenas. string.Empty se parece a un acceso regular de miembro de clase. Durante una mirada rápida, es más fácil detectar "" o intuir el significado.
Encuentra las cadenas (la coloración de desbordamiento de pila no está ayudando exactamente, pero en VS esto es más obvio):
fuente
\u00ad
.Todos aquí dieron alguna buena aclaración teórica. Tuve una duda similar. Así que probé una codificación básica. Y encontré una diferencia. Aquí está la diferencia.
Entonces parece que "Nulo" significa absolutamente vacío y "Cadena. Vacío" significa que contiene algún tipo de valor, pero está vacío.
fuente
""
versusstring.Empty
. Solo cuando se trataba de saber si la cadena está vacía, senull
había mencionado.