La distinzione tra tipi di riferimento e tipi di valore è fondamentalmente un compromesso prestazionale nella progettazione della lingua. I tipi di riferimento hanno un certo sovraccarico di costruzione, distruzione e raccolta dei rifiuti, poiché sono creati nell'heap. D'altra parte, i tipi di valore hanno un sovraccarico nelle chiamate al metodo (se la dimensione dei dati è maggiore di un puntatore), poiché l'intero oggetto viene copiato anziché solo un puntatore. Poiché le stringhe possono essere (e in genere sono) molto più grandi delle dimensioni di un puntatore, sono progettate come tipi di riferimento. Inoltre, come ha sottolineato Servy, la dimensione di un tipo di valore deve essere nota al momento della compilazione, il che non è sempre il caso delle stringhe.
La questione della mutabilità è una questione separata. Sia i tipi di riferimento che i tipi di valore possono essere mutabili o immutabili. I tipi di valore sono in genere immutabili, poiché la semantica dei tipi di valori mutabili può essere fonte di confusione.
I tipi di riferimento sono generalmente mutabili, ma possono essere progettati come immutabili se ha senso. Le stringhe sono definite immutabili perché rendono possibili alcune ottimizzazioni. Ad esempio, se la stessa stringa letterale si verifica più volte nello stesso programma (che è abbastanza comune), il compilatore può riutilizzare lo stesso oggetto.
Quindi perché "==" è sovraccarico per confrontare le stringhe con il testo? Perché è la semantica più utile. Se due stringhe sono uguali per il testo, potrebbero essere o meno gli stessi riferimenti agli oggetti a causa delle ottimizzazioni. Quindi confrontare i riferimenti è piuttosto inutile, mentre confrontare i testi è quasi sempre quello che vuoi.
Parlando più in generale, Strings ha quella che viene definita semantica di valore . Questo è un concetto più generale rispetto ai tipi di valore, che è un dettaglio di implementazione specifico per C #. I tipi di valore hanno una semantica di valore, ma i tipi di riferimento possono anche avere una semantica di valore. Quando un tipo ha una semantica di valore, non si può davvero dire se l'implementazione sottostante è un tipo di riferimento o un tipo di valore, quindi è possibile considerare che un dettaglio dell'implementazione.
is
da parte i test), la risposta è probabilmente "per ragioni storiche". Le prestazioni della copia non possono essere la ragione poiché non è necessario copiare fisicamente oggetti immutabili. Ora è impossibile cambiare senza rompere il codice che utilizza effettivamente iis
controlli (o vincoli simili).