¿Por qué usar string.Empty sobre "" cuando se asigna a un objeto string

13

He estado ejecutando StyleCop sobre mi código y una de las recomendaciones SA1122 es usar string.Empty en lugar de "" al asignar una cadena vacía a un valor.

Mi pregunta es por qué se considera esta mejor práctica. O, ¿se considera esta mejor práctica? Supongo que no hay diferencia de compilación entre las dos declaraciones, por lo que solo puedo pensar que es una cuestión de legibilidad.

SO pregunta y respuesta

Jon Skeet respuesta a la pregunta

dreza
fuente
55
Estoy seguro de que esto fue preguntado y respondido en Stack Overflow, pero tengo problemas para encontrarlo. Tiene que ver con el hecho de que tiene que crear una instancia de un nuevo objeto de cadena para "", pero nostring.Empty
ChrisF
@ChrisF Ahh, no pensé en buscar en el desbordamiento de pila para este tipo de pregunta. Voy a echar un vistazo.
dreza
1
dup de preguntas sobre stackoverflow: stackoverflow.com/questions/151472/…
quentin-starin
@ChrisF: se ha preguntado en SO. Una y otra y otra vez ...
Oded
1
Aquí vamos - stackoverflow.com/questions/151472/… - desde septiembre de 2008.
ChrisF

Respuestas:

12

Una razón válida es que deja en claro que no se trata de un error tipográfico o de marcador de posición, que realmente quisiste usar la cadena vacía aquí.

No sé si se considera "mejor práctica".

Philip
fuente
7

Me imagino que hay dos razones, una para la legibilidad y dos para un aumento de rendimiento menor.

La legibilidad es fácil: es mucho más rápido de detectar string.Emptyque "". La búsqueda string.Emptytambién suele ser más fácil y tal vez más precisa que buscar el literal. También aclara la intención: no solo cometiste un error tipográfico u olvidaste terminar algo, realmente querías una cadena vacía.

La razón del rendimiento se debe a la pasantía . Verá, el tiempo de ejecución mantiene una tabla de cadenas utilizadas anteriormente para que pueda hacer rápidamente comparaciones de cadenas sin hacer una verificación carácter por carácter. string.Emptyya es una referencia interna sobre ""dónde, ya que escribir el literal puede no darle la versión interna, lo que provoca un ligero impacto en el rendimiento.

CodexArcanum
fuente
77
una pizca, escribiendo el literal "" siempre le dará la misma versión interna de "", al menos desde .Net 2 en adelante.
quentin-starin
Correcto, el artículo de pasantías sobre MSDN es un poco difícil de seguir en ese punto. Parece "" y cadena. Vacío debería apuntar a la misma cadena interna, pero parece indicar algunas diferencias entre las versiones de tiempo de ejecución de .net. Creo que cualquier cadena literal que aparezca varias veces en el código será internada en el segundo y en otros usos, ¿sí?
CodexArcanum
44
También debo enfatizar que cuando digo leve, me refiero a súper pequeño. "Debido al rendimiento" no es una razón para cambiar de una representación a otra, solo es algo interesante que vale la pena saber sobre el tiempo de ejecución.
CodexArcanum
44
También debe tenerse en cuenta que el aspecto del rendimiento solo es cierto para la compilación. Como ambos compilan en el mismo IL, el rendimiento del tiempo de ejecución debería ser idéntico.
lzcd
aumento de rendimiento que sólo sería en la compilación
trinquete monstruo
4

string.Empty gana en un caso realmente de esquina, lo que puede conducir a algún error mágico y muy difícil de depurar:

Si hay un espacio de ancho cero en "".

Yuby
fuente
0

Según alguna documentación que encontré, tiene que ver con lo que emite el compilador.

Una búsqueda rápida revela: http://stylecop.soyuz5.com/SA1122.html

Por qué está archivado bajo "Reglas de legibilidad" con esa descripción es desconcertante.

brian
fuente