El stringtipo es inmutable.
Podemos usar la constpalabra clave stringsen un lenguaje de alto nivel como .NET. Mi comprensión de 'const' significa constante (sigue siendo la misma, no podemos cambiar el valor).
¿ stringsNo son siempre constant(OMI, el término constantno 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

finalmodificador 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
stringo aintegerel contenido de la variable (o lo que apunta) no se puede cambiar o asignar en tiempo de compilación.fuente
constno 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
constimplicastatic) 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
Stringle permitiría hacerlotext.substring(1)sin tener que asignarlo nuevamente a latextvariable, y cambiaría el objeto original. Si quieres que la variabletextno 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
Stringse 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
finalmodificador en Java y elconstmodificador 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
constlogra. Esto es aplicable a C # y lenguajes similares.fuente
constcomporta, el comportamiento no es exclusivo deconst. En Java, lafinalpalabra clave se comporta de manera similar y en C # lareadonlypalabra clave hace lo mismo. Lo único de aconstes que se conoce en tiempo de compilación.