'cadena constante' frente a 'cadena estática de solo lectura' en C #


Respuestas:


171

Cuando usa una constcadena, el compilador incrusta el valor de la cadena en tiempo de compilación .
Por lo tanto, si usa un constvalor en un ensamblado diferente, luego actualiza el ensamblado original y cambia el valor, el otro ensamblado no verá el cambio hasta que lo vuelva a compilar .

Una static readonlycadena es un campo normal que se busca en tiempo de ejecución. Por lo tanto, si se cambia el valor del campo en un ensamblado diferente, los cambios se verán tan pronto como se cargue el ensamblado, sin volver a compilar.

Esto también significa que una static readonlycadena puede usar miembros no constantes, como Environment.UserNameo DateTime.Now.ToString(). Una constcadena solo se puede inicializar utilizando otras constantes o literales.
Además, static readonlyse puede establecer una cadena en un constructor estático; unaconst cadena solo se puede inicializar en línea.

Tenga en cuenta que static stringse puede modificar a; debería usar static readonlyen su lugar.


25
+1, Y la conclusión obvia, desde un punto de vista práctico y semántico: constsolo debe usarse para constantes, siendo las constantes valores que nunca , nunca , nunca cambian.
LukeH

3
@LukeH nunca, nunca, nunca es un poco fuerte. No puedo pensar en nada malo que sucedería si uno declarara una cadena privada como constante y la cambiara entre dos eventos de recompilación.
Brenda Bell

5
@Brenda: Admito que uso private constpara valores que no son, estrictamente hablando, constantes; básicamente, se usa indebidamente constcon fines de microoptimización. Voy a defender mi declaración de "nunca, nunca, nunca" , incluso si me convierte en un hipócrita. ;)
LukeH

¿Qué pasa con el rendimiento en el caso de las cuerdas en particular? ¿Cada uso constante producirá una nueva copia de una cadena en la memoria?
Andrii

@Andrii no, las cadenas constantes se crean una vez. Cada uso tendrá la misma referencia en la memoria.
Migg

43

Aquí hay un buen desglose de los pros y los contras :

Por lo tanto, parece que las constantes deben usarse cuando es muy poco probable que el valor cambie alguna vez, o si ninguna aplicación / biblioteca externa usará la constante. Los campos estáticos de solo lectura se deben utilizar cuando se requiere el cálculo del tiempo de ejecución o si los consumidores externos son un factor.


19
Punto muy interesante del artículo: "En un nivel alto, las constantes obviamente se tratan en tiempo de compilación, mientras que los campos de solo lectura estáticos se establecen en el momento en que se evalúan en tiempo de ejecución. El hecho de que los valores constantes sean sustituidos por el compilador significa que cualquier biblioteca / ensamblado que haga referencia al valor constante deberá volver a compilarse si el valor constante cambia. Las bibliotecas que hacen referencia a un campo estático de solo lectura harán referencia al campo y no al valor, por lo que recogerán cualquier cambio en el campo sin la necesidad para la recopilación "
s_hewitt

1
Sí, lo leí también y tuve un momento. Definitivamente no lo sabía.
Spinon

Aquí está la versión en caché de Google: webcache.googleusercontent.com/…
spinon el

2
El enlace de referencia ya no está disponible.
Salomon Zhang

Este es un excelente cumplido para la respuesta marcada como la solución. Definir el uso es muy útil. +1 de mi parte.
Bonez024

11

const

public const string MyStr;

es una constante de tiempo de compilación (puede usarla como parámetro predeterminado para un parámetro de método, por ejemplo), y no se ofuscará si usa dicha tecnología

static readonly

public static readonly string MyStr;

es constante en tiempo de ejecución . Significa que se evalúa cuando se lanza la aplicación y no antes. Es por eso que no se puede usar como parámetro predeterminado para un método (error de compilación), por ejemplo. El valor almacenado en él se puede ofuscar.


6

OQ preguntó sobre static stringvsconst . Ambos tienen diferentes casos de uso (aunque ambos se tratan como estáticos).

Utilice const solo para valores verdaderamente constantes (por ejemplo, velocidad de la luz, pero incluso esto varía según el medio). La razón de esta pauta estricta es que el valor de const se sustituye en los usos de const en ensamblados que hacen referencia a él, lo que significa que puede tener problemas de versiones si la const cambia en su lugar de definición (es decir, no debería haber sido una constante después de todo). Tenga en cuenta que esto incluso afecta a los private constcampos porque es posible que tenga una base y una subclase en diferentes ensamblajes y los campos privados se heredan .

Los campos estáticos están vinculados al tipo en el que se declaran. Se utilizan para representar valores que deben ser iguales para todas las instancias de un tipo determinado. Estos campos se pueden escribir tantas veces como desee (a menos que se especifique solo lectura).

Si se refería a static readonlyvs const, lo recomendaría static readonlypara casi todos los casos porque es más a prueba de futuro.


¿Quién es ese "OQ" del que hablas?
Peter Mortensen

"Pregunta original"
Ben Aston

0

Puede cambiar el valor de a static readonly stringsolo en el staticconstructor de la clase o en un inicializador de variable, mientras que no puede cambiar el valor de una constcadena en ninguna parte.


2
No veo cómo esto agrega nada más allá de lo que ya dicen las respuestas existentes.
Financia la demanda de Monica el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.