web-dev-qa-db-fra.com

Pourquoi l'ajout de null à une chaîne est-il légal?

L'article MSDN sur String Basics montre ceci:

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

Pourquoi la concaténation avec null ne déclenche-t-elle pas une exception de référence null? Est-ce pour faciliter la vie d'un programmeur, afin qu'il n'ait pas à vérifier la nullité avant la concaténation?

61
David Hodgson

De MSDN :

Dans les opérations de concaténation de chaînes, le compilateur C # traite une chaîne nulle de la même manière qu'une chaîne vide, mais il ne convertit pas la valeur de la chaîne nulle d'origine.

Plus d'informations sur + opérateur binaire :

L'opérateur binaire + effectue la concaténation de chaînes lorsqu'un ou les deux opérandes sont de type chaîne.

Si un opérande de concaténation de chaînes est nul, une chaîne vide est substituée. Sinon, tout argument non chaîne est converti en sa représentation sous forme de chaîne en appelant la méthode ToString virtuelle héritée de l'objet type.

Si ToString renvoie null, une chaîne vide est remplacée.

57
CMS

Je suis d'accord que les chaînes conceptuelles ne sont que des valeurs. Cependant, considérez le code suivant:

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

Si les autres opérateurs de type valeur utilisaient default () comme les opérateurs de chaîne convertissent null en "", votre explication aurait un sens.

Il est plus simple de dire que les opérateurs de chaîne sont un raccourci (cas spécial) pour plus de commodité.

6
Nathan Alden

Sur le plan conceptuel, les chaînes sont normalement considérées comme des valeurs par opposition aux références à des objets qui ont une identité. L'une des principales raisons pour lesquelles ils ne sont pas des struct avec une sémantique de valeur est à cause de la surcharge qui accompagne la copie sur affectation. Si les chaînes étaient elles ne pouvaient pas être nullables et donc un null est juste traité par l'opérateur "+" comme s'il s'agissait d'une chaîne vide (c'est-à-dire comme si la fonction default(string) == "" tout comme default(int) == 0).

3
Mark Cidade

Je suppose que les concepteurs du langage (ou de la bibliothèque standard) ont décidé que ce serait un cas assez courant pour rendre service aux programmeurs.

(Neat! J'ai toujours supposé que concéder avec null le ferait par le biais d'une exception!)

1
Dana

La raison pour laquelle il ne lève pas d'exception de référence nulle est que vous n'essayez pas réellement d'accéder à des propriétés ou des méthodes sur l'objet nul. Comme CMS cite, lors de la concaténation de chaîne, les valeurs nulles sont remplacées par des chaînes vides.

0
tarn