65 votes

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

L'article de 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, de sorte qu'il n'ait pas à vérifier la valeur null avant la concaténation?

60voto

CMS Points 315406

À partir de MSDN:

Dans la concaténation de chaîne des opérations, le compilateur C# traite une chaîne null le même comme une chaîne vide, mais il ne pas convertir la valeur de l' original chaîne nulle.

Plus d'informations sur le + opérateur binaire:

Le binaire + opérateur effectue la chaîne concaténation lorsque l'un ou les deux les opérandes sont de type string.

Si un opérateur de concaténation de chaîne est null, une chaîne vide est substitué. Sinon, tous les non-argument de chaîne est converti en sa représentation sous forme de chaîne en invoquant le virtuel ToString méthode héritée de type objet.

Si ToString renvoie la valeur null, une chaîne vide est substitué.

3voto

Mark Cidade Points 53945

Conceptuellement, les chaînes sont généralement considérées comme des valeurs et non comme des références à des objets ayant une identité. L'une des principales raisons pour lesquelles ils ne sont pas struct s avec une sémantique de valeur est due à la surcharge liée à la copie en affectation. Si les chaînes étaient des valeurs, elles ne pouvaient pas être annulées et un null est simplement traité par l'opérateur "+" comme s'il s'agissait d'une chaîne vide (c'est-à-dire, comme si default(string) == "" comme default(int) == 0 ).

1voto

Dana Points 9876

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

(Neat! J'ai toujours juste supposé que concilier avec null passerait par une exception!)

0voto

tarn Points 1615

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X