Pourquoi le second produit-il une exception alors que le premier ne le fait pas?
string s = null;
MessageBox.Show(s);
MessageBox.Show(s.ToString());
Mis à jour - l'exception que je peux comprendre, le casse-tête (pour moi) est la raison pour laquelle la première partie ne montre pas d'exception. Cela n'a rien à voir avec la boîte de message, comme illustré ci-dessous.
Par exemple :
string s = null, msg;
msg = "Message is " + s; //no error
msg = "Message is " + s.ToString(); //error
La première partie semble convertir implicitement une valeur null en une chaîne vide.
car vous ne pouvez pas appeler la méthode d'instance ToString()
sur une référence null
.
Et MessageBox.Show()
est probablement implémenté pour ignorer la valeur null et imprimer une boîte de message vide.
Parce que MessageBox.Show () est implémenté avec pinvoke, il appelle la fonction Windows MessageBox () native. Ce qui ne dérange pas d'obtenir un NULL pour l'argument lpText. Le langage C # a des règles beaucoup plus strictes pour les méthodes d'instance .NET pures (comme ToString), il émet toujours du code pour vérifier que l'objet n'est pas nul. Il y a quelques informations de fond à ce sujet dans ce blog post .
En coulisse, concat est appelé dans votre question de suivi/mise à jour, par exemple.
string snull = null;
string msg = "hello" + snull;
// is equivalent to the line below and concat handles the null string for you.
string msg = String.Concat("hello", snull);
// second example fails because of the toString on the null object
string msg = String.Concat("hello", snull.ToString());
//String.Format, String.Convert, String.Concat all handle null objects nicely.
Comme cette question occupe une place de choix sur Google pour la recherche "c # toString null", j'aimerais ajouter que la méthode Convert.ToString(null)
renverrait une chaîne vide.
Cependant, pour réaffirmer les autres réponses, vous pouvez utiliser string.Concat("string", null)
dans cet exemple.
Vous essayez d'exécuter la méthode ToString () sur un null. Vous avez besoin d'un objet valide pour exécuter une méthode.
La fonction .show doit avoir la vérification NULL et la gérer.
En effet, le second appel attend qu'un objet de "s" réponde à une demande de méthode ToString (). Ainsi, avant que .Show () soit appelée, la méthode s.ToString () échouait avec une tentative d’appel d’une méthode.
Il est intéressant de noter que si .Show () est implémenté correctement, de nombreuses méthodes de ce type s’attendent à ce que des instances non nulles soient passées. C’est généralement lorsque vous utilisez un modèle NullObject afin que l’appelant ne soit pas obligé de gérer ce comportement.
Probablement la méthode Show gère une valeur null et ne montre rien. La deuxième utilisation de s - s.ToString () échoue car vous n’avez pas de méthode ToString à exécuter.