2013-08-15 3 views
2

Pour autant que je sache Console.WriteLine() (ou Console.Write()) appelle la méthode ToString() de l'objet pour obtenir la représentation de chaîne de l'objet droit? Donc, ces deux appels à Console.WriteLine() sont les mêmes droits?Confusion à propos de NullReferenceException

Foo foo = new Foo(); 

Console.WriteLine(foo); // This is same as the one bellow 
Console.WriteLine(foo.ToString()); 

Supposons donc la situation suivante. Je déclare instantiate un tableau de Foos. Ensuite, j'appelle Console.WriteLine() sur n'importe quel élément du tableau sans instancier le Foos lui-même. Donc, dans ce cas, nous avons un tableau de Foos et chaque Foo dans le tableau est null alors l'appel à Console.WriteLine() devrait provoquer un NullReferenceException à être lancé correctement? Mais les choses est que si vous l'appelez comme ce

Console.WriteLine(foos[0]) 

rien ne se passe à l'exception du Environment.NewLine en cours d'écriture dans la fenêtre de la console, mais si vous l'appelez comme ça

Console.WriteLine(foos[0].ToString()) 

il jette en fait un NullReferenceException. Quelle est la différence entre ces deux appels? Je veux dire dans le premier je n'appelle pas explicitement ToString() mais ne devrait-il pas être appelé implicitement par Console.WriteLine() de toute façon? Et comment le NullReferenceException n'est pas jeté dans le premier cas?

Répondre

13

Donc ces deux appels à Console.WriteLine() sont les mêmes droits?

Non, parce que Console.WriteLinene le fait pas appelToString sur une référence null - il utilise simplement la chaîne vide à la place. Il détecte cela lui-même.

Le documentation déclare explicitement:

Si la valeur est nulle, seule la terminaison de ligne est écrite. Sinon, la méthode ToString de la valeur est appelée pour produire sa représentation sous forme de chaîne et la chaîne résultante est écrite dans le flux de sortie standard.

Sans appel au ToString, il n'y a pas de NullReferenceException.

string.Format se comporte de la même manière. Par exemple:

object value = null; 
string text = string.Format("Value: '{0}'", value); 

sera mis text à Value: ''

5

Console.WriteLine Method (Object)

Si la valeur est null, seule la terminaison de ligne est écrite. Sinon, la méthode de valeur ToString est appelée pour produire sa représentation sous forme de chaîne et la chaîne résultante est écrite dans le flux de sortie standard.

Donc Console.WriteLine(obj) et Console.WriteLine(obj.ToString()) ne sont pas exactement les mêmes.

Et un peu de code:

public virtual void WriteLine(object value) 
{ 
    if (value == null) 
    { 
     this.WriteLine(); 
     return; 
    } 
    IFormattable formattable = value as IFormattable; 
    if (formattable != null) 
    { 
     this.WriteLine(formattable.ToString(null, this.FormatProvider)); 
     return; 
    } 
    this.WriteLine(value.ToString()); 
} 
0
Console.WriteLine(foos[0]) 

dans la ligne ci-dessus comme il est nul selon donc documentation terminaison de ligne sera écrite et rien d'autre. Je suppose qu'il sera d'abord vérifier si l'objet est nul alors écrire le terminateur de ligne sinon appeler la méthode ToString() sur l'objet. Considérant que

Console.WriteLine(obj.ToString()) 

appelle la méthode ToString sur null qui est une exception.