132 votes

Pourquoi est-ce valable pour concaténer des chaînes Null mais pas à l’appel « null. ToString() » ?

Il s’agit de code c# valide

Ce n’est pas valide code c#

Pourquoi est la première instruction valide ?

165voto

Pranay Rana Points 69934

La raison première de travail:

À 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 convertit pas à la valeur de la chaîne nulle.

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

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

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

Si ToString retours null, une chaîne vide est substitué.

La raison de l'erreur dans le deuxième est:

null (Référence C#) - Le mot clé null est un littéral qui représente une référence nulle, on ne fait pas référence à un objet. la valeur null est la valeur par défaut de référence des variables de type.

109voto

Botz3000 Points 23640

Parce que l' + opérateur en C# à l'interne se traduit par String.Concat, ce qui est une méthode statique. Et cette méthode se produit pour traiter l' null comme une chaîne vide. Si vous regardez le code source de l' String.Concat dans le Réflecteur, vous verrez:

// while looping through the parameters
strArray[i] = (str == null) ? Empty : str;
// then concatenate that string array

MSDN (en fait mention, trop: http://msdn.microsoft.com/en-us/library/k9c94ey1.aspx)

D'autre part, ToString() est une méthode d'instance, qui vous ne pouvez pas appeler sur null (ce type doit être utilisée pour l' null?).

30voto

Le premier échantillon sera traduit en:

 var bob = String.Concat("abc123", null, null, null, "abs123");
 

La méthode Concat vérifie l'entrée et traduit null en tant que chaîne vide

Le deuxième échantillon sera traduit en:

 var wtf = ((object)null).ToString();
 

Donc, une exception de référence null sera générée ici

11voto

Talha Points 7596

La première partie de votre code est traitée comme dans l' String.Concat,

est ce que le compilateur C# appels lorsque vous ajoutez des chaînes de caractères. "abc" + null se traduit en String.Concat("abc", null),

et en interne, qui remplace la méthode null avec String.Empty. Donc, c'est pourquoi votre première partie de code ne jetez pas exception à la règle. il est juste comme

var bob = "abc" + string.Empty + string.Empty + string.Empty + "123";  //abc123

Et dans la 2e partie de votre code throws exception parce que 'null' est pas un objet, le mot clé null est un littéral qui représente une référence nulle, on ne fait pas référence à un objet. la valeur null est la valeur par défaut de référence des variables de type.

Et 'ToString()"est une méthode qui peut être appelée par une instance d'un objet, mais pas littérale.

9voto

supercat Points 25534

Dans le COM-cadre qui a précédé .net, il est nécessaire pour tout de routine qui a reçu une chaîne afin de la libérer quand il a été fait avec elle. Parce qu'il était très commun pour les cordes à vide à passer dans et hors de routines, et parce que de tenter de "libre" d'un pointeur null a été défini comme un légitime de ne rien opération, Microsoft a décidé d'avoir un pointeur de chaîne null représenter une chaîne vide.

Pour permettre une compatibilité avec COM, de nombreuses routines .net va interpréter un objet null comme une représentation juridique comme une chaîne vide. Avec quelques légères modifications .net et de ses langues (notamment en permettant à des membres de l'instance pour indiquer "ne pas invoquer comme virtuel"), Microsoft pourrait avoir fait null objets de type déclaré de la Chaîne se comportent plus comme des chaînes vides. Si Microsoft avait fait, elle aurait également dû faire l' Nullable<T> fonctionnent un peu différemment (de manière à permettre l' Nullable<String>--quelque chose qu'ils devraient à mon humble avis, fait de toute façon) et/ou de définir un NullableString type qui serait essentiellement interchangeables avec String, mais qui ne concerne pas un null valide chaîne vide.

Comme il est, il y a quelques contextes dans lesquels un null sera considérée comme légitime chaîne vide et d'autres dans lesquels il ne sera pas. Pas très utile de la situation, mais les programmeurs doivent être conscients de. En général, les expressions de la forme stringValue.someMember échouera si stringValue est null, mais la plupart cadre des méthodes et des opérateurs qui acceptent les chaînes de caractères comme des paramètres égard null comme une chaîne vide.

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