2009-03-12 2 views
51

l'articolo di MSDN su String Basics mostra questo:Perché l'aggiunta di null a una stringa è legale?

string str = "hello"; 
string nullStr = null; 
string emptyStr = ""; 

string tempStr = str + nullStr; // tempStr = "hello" 
bool b = (emptyStr == nullStr);// b = false; 
string newStr = emptyStr + nullStr; // creates a new empty string 
int len = nullStr.Length; // throws NullReferenceException 

Perché non concatenando con null un'eccezione riferimento null? È per rendere più facile la vita di un programmatore, in modo che non debbano controllare nulla prima della concatenazione?

risposta

51

Da MSDN:

Nelle operazioni di concatenazione di stringa, il C# compilatore tratta una stringa nulla la stessa come una stringa vuota, ma non converte il valore della stringa originale nulla .

Ulteriori informazioni sul + binary operator:

L'operatore binario + esegui stringa concatenazione quando uno o entrambi operandi sono di tipo stringa.

Se un operando di concatenazione di stringhe è null, viene sostituita una stringa vuota. Altrimenti, qualsiasi argomento non stringa è convertito nella sua rappresentazione di stringa invocando il metodo virtuale ToString ereditato dall'oggetto tipo.

Se ToString restituisce null, viene sostituita una stringa vuota .

+0

La domanda riguardava in ultima analisi la logica del linguaggio. Alcune persone hanno provato a fare supposizioni in altre risposte. Avremmo bisogno di qualcuno della SM per rispondere qui. –

+0

Scelta eccellente da parte del team C# in quanto ha funzionato come un fascino con l'operatore C-6 null-condizionale, specialmente se associato alle caratteristiche di interpolazione della stringa C# 6: ad es. 'return $" {persona? .FirstName} {persona? .LastName} "' – GDS

0

Il motivo per cui non genera un'eccezione di riferimento null è perché in effetti non si sta tentando di accedere a proprietà o metodi sull'oggetto null. Come cita CMS, quando si concatena la stringa, i valori nulli vengono sostituiti con stringhe vuote.

+0

Questo è ciò che fa, non * perché * lo fa. –

1

Immagino che i progettisti della lingua (o della libreria standard) abbiano deciso che sarebbe stato un caso abbastanza comune che avrebbero fatto un favore ai programmatori.

(Neat! Ho sempre dato per scontato concating con null avrei attraverso un'eccezione!)

3

Concettualmente, le stringhe sono normalmente pensato come valori in contrapposizione a riferimenti a oggetti che hanno identità. Uno dei motivi principali per cui non sono struct s con semantica del valore è a causa del sovraccarico che viene fornito con la copia in assegnazione. Se le stringhe erano valori, non potevano essere annullabili e quindi un null viene semplicemente trattato dall'operatore "+" come se fosse una stringa vuota (ad esempio, default(string) == "" come default(int) == 0).

6

Sono d'accordo che concettualmente le stringhe sono solo valori. Tuttavia, si consideri il seguente codice:

int? i = null; 
i += 1; // The result of this is that i == null 

Se gli altri operatori di tipo valore utilizzato di default() il modo in cui gli operatori di stringa stanno convertendo null per "", la tua spiegazione avrebbe senso.

È più semplice dire che gli operatori di stringa sono una scorciatoia (caso speciale) per comodità.