Il s’agit de code c# valide
Ce n’est pas valide code c#
Pourquoi est la première instruction valide ?
Il s’agit de code c# valide
Ce n’est pas valide code c#
Pourquoi est la première instruction valide ?
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
retoursnull
, 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.
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
?).
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
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.
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 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.