Ecco un buon modo di pensare alla differenza tra tipi di valore, passaggio per valore, tipi di riferimento e passaggio per riferimento:
Una variabile è un contenitore.
Una variabile di tipo valore contiene un'istanza. Una variabile del tipo di riferimento contiene un puntatore a un'istanza memorizzata altrove.
La modifica di una variabile di tipo valore modifica l'istanza in essa contenuta. La modifica di una variabile del tipo di riferimento comporta la mutazione dell'istanza a cui punta.
Le variabili separate del tipo di riferimento possono puntare alla stessa istanza. Pertanto, la stessa istanza può essere modificata tramite qualsiasi variabile che punti ad essa.
Un argomento passato per valore è un nuovo contenitore con una nuova copia del contenuto. Un argomento passato per riferimento è il contenitore originale con il suo contenuto originale.
Quando un argomento di tipo valore viene passato per valore: la riassegnazione del contenuto dell'argomento non ha alcun effetto al di fuori dell'ambito, poiché il contenitore è univoco. La modifica dell'argomento non ha alcun effetto al di fuori dell'ambito, poiché l'istanza è una copia indipendente.
Quando un argomento del tipo di riferimento viene passato per valore: la riassegnazione del contenuto dell'argomento non ha alcun effetto al di fuori dell'ambito, poiché il contenitore è univoco. La modifica del contenuto dell'argomento influisce sull'ambito esterno, poiché il puntatore copiato punta a un'istanza condivisa.
Quando un argomento viene passato per riferimento: la riassegnazione del contenuto dell'argomento influisce sull'ambito esterno, poiché il contenitore è condiviso. La modifica del contenuto dell'argomento influisce sull'ambito esterno, poiché il contenuto è condiviso.
In conclusione:
Una variabile stringa è una variabile di tipo riferimento. Pertanto, contiene un puntatore a un'istanza memorizzata altrove. Quando viene passato per valore, il suo puntatore viene copiato, quindi la modifica di un argomento stringa dovrebbe influire sull'istanza condivisa. Tuttavia, un'istanza di stringa non ha proprietà modificabili, quindi un argomento di stringa non può essere modificato comunque. Se passato per riferimento, il contenitore del puntatore è condiviso, quindi la riassegnazione influirà comunque sull'ambito esterno.