Una cadena es inmutable, entonces ¿por qué no son todas constantes?

7

El tipo string es inmutable.

Podemos usar la palabra clave const con strings en lenguaje de alto nivel como .NET. Mi comprensión de 'const' significa constante (sigue siendo el mismo, no podemos cambiar el valor).

¿ strings no siempre es constant (OMI, el término constant no debería ser aplicable en el mismo contexto si el tipo se debe recrear cada vez que significa el tiempo de vida de los valores, fue constante)? / p>

En lenguajes de alto nivel, específicamente .NET (aunque también me interesaría Java), ¿se debe esto a la administración de memoria / seguimiento de objetos en general o hay alguna otra razón?

    
pregunta Dave 15.03.2013 - 15:20

5 respuestas

21

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, un string ), el contenido de la memoria de este objeto se no modifica. En su lugar:

    1. Se asigna un bloque de memoria nuevo .
    2. El contenido del objeto que intentaste modificar se copia en este nuevo bloque, con la parte que querías cambiar se cambia en este nuevo bloque.
    3. El puntero (es decir, la referencia) se asigna a este nuevo bloque.
  • Constante significa que la variable no se puede modificar en tiempo de compilación. Si un string o un integer el contenido de la variable (o lo que señala) no se puede cambiar o asignar en el momento de la compilación.

respondido por el rae1 15.03.2013 - 15:37
6

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 nunca se le asignaría un lugar en la memoria. Incluso si el compilador no se optimiza de esa manera, aún se le asigna un lugar en la memoria en el lanzamiento (ya que const implica static ) 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 (teóricamente) almacenarse en múltiples variables. Asignar una variable que apunta a un valor inmutable simplemente crea una nueva 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 ocurrir incluso mientras el programa se está ejecutando.

    
respondido por el Bobson 15.03.2013 - 15:35
2

Las cadenas no pueden cambiar. Los punteros a las cadenas pueden cambiar. El siguiente es un código válido:

String text = "Text";
text = text.substring(1);

El objeto "Texto" original todavía está allí, sin cambios e inmutable, excepto que ya no hay nada que lo apunte. Un String mutable le permitiría hacer text.substring(1) sin tener que volver a asignarlo a la variable text , y cambiaría el objeto original. Si desea que la variable text no cambie, eso es cuando lo hace un const . 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 objetos tienen diferentes tipos.

    
respondido por el Karl Bielefeldt 15.03.2013 - 15:41
1

Creo que estás confundiendo variables y objetos.

Una variable es simplemente una referencia a un objeto .

Mientras se ejecuta su programa, una variable puede hacer referencia 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.

Un String se considera inmutable (en Java, y también lo esperaría en .Net) porque no hay manera de cambiar el objeto .

Una constante es simplemente una variable que no se permite cambiar durante la vida del programa. Se define una constante con el modificador final en Java y el modificador const en .Net.

Sin embargo, si su variable "constante" apunta a un objeto mutable, la "constancia" de la variable no afecta a la mutabilidad del objeto (en realidad, no puedo decir eso con seguridad en .Net, porque Suponiendo que herede algunas de las reglas arcanas de C ++).

    
respondido por el parsifal 15.03.2013 - 15:42
-1

Una demostración simple de lo que const acompaña. Esto es aplicable a C # y lenguajes similares.

string noconst = "foo";
noconst = "bar"; //noconst has changed! It was declared as "foo" but now is "bar"

const string yesconst = "foo";
yesconst = "bar"; //compiler error
    
respondido por el Brian 15.03.2013 - 15:31

Lea otras preguntas en las etiquetas