El string
tipo es inmutable.
Podemos usar la const
palabra clave strings
en un lenguaje de alto nivel como .NET. Mi comprensión de 'const' significa constante (sigue siendo la misma, no podemos cambiar el valor).
¿ strings
No son siempre constant
(OMI, el término constant
no debería ser aplicable en el mismo contexto si el tipo tiene que ser recreado cada vez que significa para los valores de tiempo de vida, era constante)?
En lenguajes de alto nivel, específicamente .NET (aunque también me interesaría Java), ¿esto se debe a la gestión / seguimiento general de la memoria de los objetos o hay alguna otra razón?
strings
immutability
Dave
fuente
fuente
final
modificador en una variable de cadena evita que la variable se cambie para apuntar a una cadena diferente.Respuestas:
Estás confundiendo dos cosas diferentes:
Inmutable significa que el contenido de la memoria del objeto no se puede modificar. Cuando modifica un objeto inmutable (por ejemplo, a
string
), el contenido de la memoria de este objeto no se modifica. En lugar:Constante significa que la variable no se puede modificar en tiempo de compilación. Si a
string
o ainteger
el contenido de la variable (o lo que apunta) no se puede cambiar o asignar en tiempo de compilación.fuente
const
no puede modificarlo. Puede definirlo como un valor inicial, pero no puede asignarle un valor diferente en ningún otro lugar, por lo tanto, no puede modificarlo.Como dicen los comentarios, estás confundiendo "constante" con "inmutable", cuando realmente significan dos cosas muy diferentes.
Una constante es una variable que no se puede cambiar. Dependiendo del idioma y del compilador, es completamente posible que el código compilado simplemente reemplace cada uso de esa variable con el valor asignado, en cuyo caso ni siquiera se le asignaría un lugar en la memoria. Incluso si el compilador no se optimiza de esa manera, todavía se le asigna un lugar en la memoria en el lanzamiento (ya que
const
implicastatic
) y permanece allí hasta la salida.Un inmutable es un valor en la memoria que no se puede cambiar (hasta que se recupere la memoria). Se le asigna un lugar en la memoria según sea necesario, y puede (en teoría) almacenarse en múltiples variables. Asignar a una variable que apunta a un valor inmutable simplemente crea un nuevo inmutable y altera la variable para que apunte a eso. El valor anterior permanece en la memoria hasta que se recolecta la basura, lo que puede suceder incluso mientras el programa se está ejecutando.
fuente
Las cuerdas no pueden cambiar. Los punteros a las cadenas pueden cambiar. El siguiente es un código válido:
El objeto original "Texto" todavía está allí, sin cambios e inmutable, excepto que ya nada lo señala. Un mutable
String
le permitiría hacerlotext.substring(1)
sin tener que asignarlo nuevamente a latext
variable, y cambiaría el objeto original. Si quieres que la variabletext
no cambie, entonces es cuando la haces aconst
. Hay casos de uso válidos para ambos.Como nota al margen, este es un buen ejemplo de un concepto que es más fácil de entender en C ++, porque los objetos y los punteros a los objetos tienen diferentes tipos.
fuente
Creo que estás confundiendo variables y objetos.
Una variable es simplemente una referencia a un objeto .
Mientras su programa se está ejecutando, una variable puede referirse a múltiples objetos . Asignar algo a la variable no cambia el objeto. Si no hay variables que hagan referencia a un objeto, se convierte en basura.
A
String
se considera inmutable (en Java, y también esperaría en .Net) porque no hay forma de cambiar el objeto .Una constante es simplemente una variable que no se permite cambiar durante la vida del programa. Define una constante con el
final
modificador en Java y elconst
modificador en .Net.Sin embargo, si su variable "constante" apunta a un objeto mutable, la "constidad" de la variable no afecta la mutabilidad del objeto (en realidad, no puedo decirlo con certeza en .Net, porque estoy asumiendo que hereda algunas de las reglas arcanas de C ++).
fuente
Una simple demostración de lo que se
const
logra. Esto es aplicable a C # y lenguajes similares.fuente
const
comporta, el comportamiento no es exclusivo deconst
. En Java, lafinal
palabra clave se comporta de manera similar y en C # lareadonly
palabra clave hace lo mismo. Lo único de aconst
es que se conoce en tiempo de compilación.