En C #, ¿cuál es la diferencia entre
static readonly string MyStr;
y
const string MyStr;
?
En C #, ¿cuál es la diferencia entre
static readonly string MyStr;
y
const string MyStr;
?
Respuestas:
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.
constsolo debe usarse para constantes, siendo las constantes valores que nunca , nunca , nunca cambian.
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. ;)
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.
constpublic 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 readonlypublic 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.
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.
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.