Una stringa è immutabile, quindi perché non sono tutte costanti?

7

Il tipo string è immutabile.

Possiamo utilizzare la parola chiave const con strings nel linguaggio di alto livello come .NET. La mia comprensione di "const" significa costante (rimane la stessa, non possiamo cambiare il valore).

strings non sempre constant (IMO il termine constant non dovrebbe essere applicabile nello stesso contesto se il tipo deve essere ricreato ogni volta che significa per i valori di durata, è costante)?

Nei linguaggi di alto livello, in particolare .NET (anche se sarei interessato anche a Java), questo è dovuto alla gestione generale della memoria / tracciamento degli oggetti o c'è un'altra ragione?

    
posta Dave 15.03.2013 - 15:20
fonte

5 risposte

21

Stai confondendo due cose diverse:

  • Immutabile significa che il contenuto della memoria dell'oggetto non può essere modificato. Quando modifichi un oggetto immutabile (ad es. string ), il contenuto della memoria di questo oggetto è non modificato. Invece:

    1. Viene assegnato un nuovo blocco di memoria.
    2. Il contenuto dell'oggetto che hai provato a modificare viene copiato in questo nuovo blocco, con la parte che desideri modificare cambiata in questo nuovo blocco.
    3. Il puntatore (cioè il riferimento) è assegnato a questo nuovo blocco.
  • Costante significa che la variabile non può essere modificata in fase di compilazione. Se un string o un integer il contenuto della variabile (o ciò a cui punta) non può essere modificato o assegnato in fase di compilazione.

risposta data 15.03.2013 - 15:37
fonte
6

Come dicono i commenti, stai confondendo "costante" con "immutabile", quando in realtà significano due cose molto diverse.

Una costante è una variabile che non può essere modificata. A seconda della lingua e del compilatore, è completamente possibile che il codice compilato sostituisca semplicemente ogni utilizzo di tale variabile con il valore assegnato ad esso, nel qual caso non verrà mai nemmeno assegnato uno spot in memoria. Anche se il compilatore non ottimizza in questo modo, viene comunque assegnato un punto in memoria all'avvio (poiché const implica static ) e rimane lì fino all'uscita.

Un immutable è un valore in memoria che non può essere modificato (fino a quando la memoria non viene recuperata). Viene assegnato un posto nella memoria secondo necessità e può (teoricamente) essere memorizzato in più variabili. Assegnare a una variabile che punta a un valore immutabile crea semplicemente una nuova immutabile e altera la variabile per puntare a quella invece. Il vecchio valore rimane in memoria fino a quando i dati non vengono raccolti, cosa che può accadere anche mentre il programma è in esecuzione.

    
risposta data 15.03.2013 - 15:35
fonte
2

Le stringhe non possono cambiare. I puntatori alle stringhe possono cambiare. Quanto segue è un codice valido:

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

L'oggetto "Testo" originale è ancora lì, invariato e immutabile, tranne che nulla lo sta indicando più. Un% mutante% co_de ti consentirebbe di fare String senza doverlo riassegnare alla variabile text.substring(1) , e cambierebbe l'oggetto originale. Se vuoi che la variabile text non cambi, è quando la rendi un text . Esistono casi d'uso validi per entrambi.

Come nota a margine, questo è un buon esempio di un concetto che è più facile da capire in C ++, perché gli oggetti e i puntatori agli oggetti hanno tipi diversi.

    
risposta data 15.03.2013 - 15:41
fonte
1

Credo che tu stia confondendo variabili e oggetti.

Una variabile è semplicemente un riferimento a un oggetto .

Mentre il programma è in esecuzione, una variabile può fare riferimento a più oggetti . Assegnare qualcosa alla variabile non cambia l'oggetto. Se non ci sono variabili che fanno riferimento a un oggetto, diventa spazzatura.

Un String è considerato immutabile (in Java, e mi aspetterei anche in .Net) perché non c'è modo di cambiare l'oggetto .

Una costante è semplicemente una variabile che non può cambiare durante la vita del programma. Definisci una costante con il modificatore final in Java e il modificatore const in .Net.

Tuttavia, se la variabile "costante" punta a un oggetto mutabile, la "costanza" della variabile non influisce sulla mutabilità dell'oggetto (in realtà, non posso affermarlo con certezza in .Net, perché io " ammesso che erediti alcune delle arcane regole del C ++).

    
risposta data 15.03.2013 - 15:42
fonte
-1

Una semplice dimostrazione di ciò che const accompagna. Questo è applicabile a C # e lingue simili.

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
    
risposta data 15.03.2013 - 15:31
fonte

Leggi altre domande sui tag