In primo luogo consideriamo perché è utile avere stringhe che sono immutabili. Considera lo schizzo seguente:
void Safe(string s)
{
if (!SecurityCheck(s)) { throw new SecurityException(); }
Dangerous(s);
}
Metodo Safe controlla se la stringa s è "sicura". Forse con "sicuro" intendiamo "l'utente è autorizzato ad accedere a questa tabella di database", o "la stringa non contiene HTML che potrebbe essere usato in un attacco di cross-site scripting", o qualsiasi altra cosa. Solo se la stringa è sicura, passa a un metodo che fa qualcosa di pericoloso con esso.
Se le stringhe fossero modificabili, un utente malintenzionato potrebbe passare una stringa "sicura" e quindi dopo il controllo di sicurezza , muta la stringa in una stringa "pericolosa". Ottenere i tempi giusti potrebbe essere complicato, ma ovviamente gli aggressori possono provare più volte, e devono solo riuscire una volta.
Questo illustra il primo valore di dati immutabili: fatti dedotti in passato sui dati rimangono veri in futuro . Se hai una coda immutabile e chiedi quanti elementi ci sono in essa, la risposta che hai ottenuto cinquemila nanosecondi fa è ancora corretta . Ciò ti consente di effettuare calcoli con sicurezza.
Il secondo grande valore dei dati immutabili è che abilita persistenza . Per persistenza non intendo la capacità di serializzare su disco (anche se ciò è utile), ma piuttosto la possibilità di riutilizzare una porzione di una struttura dati quando si costruisce una struttura dati più grande . Se hai un grande albero immutabile e vorresti che fosse un sotto-albero di un albero più grande, nessun problema. Sai che non cambierà, quindi puoi condividere i dati in sicurezza. Ma se hai, per esempio, una coda mutabile e vorresti usare il suo contenuto in un'altra struttura dati, dovrai fare una copia.
Questo è solo un breve schizzo; guarda la mia serie di articoli su strutture dati immutabili per maggiori dettagli:
link