71 votes

Comment string.Format gère les valeurs NULL?

Dans le code suivant ci-dessous, pourquoi les deux string.Format se comportent de la même manière? Dans le premier cas, aucune exception n'est levée et dans le second cas, une exception ArgumentNullException est levée.

 static void Main(string[] args)
{
    Exception e = null;
    string msgOne = string.Format("An exception occurred: {0}", e);
    string msgTwo = string.Format("Another exception occurred: {0}", null);
}
 

Quelqu'un pourrait-il m'aider à comprendre la différence entre les deux?

58voto

Brad Christie Points 58505

Je devine ici, mais il semble être la différence de ce qui a surchargé d'appels vous êtes à la frapper. String.Format a plusieurs surcharges, c'est juste sur lequel vous êtes en train de frapper.

Dans le premier exemple, il serait judicieux de vous frappent String.Format(string,object).

Dans le deuxième exemple en fournissant null vous êtes plus susceptible de frapper String.Format(string,params object[]) qui, par la documentation, poserait un ArgumentNullException lorsque:

format ou des arguments est null.

Si vous êtes en cours d'exécution .NET4, essayez d'utiliser des paramètres nommés:

String.Format("Another exception occured: {0}", arg0: null);

Pourquoi est-il frapper l' params object[] de surcharge? Probablement parce qu' null n'est pas un objet, et la façon dont params fonctionne est que vous pouvez passer soit chaque valeur comme un nouvel objet de l'appel ou lui passer un tableau de valeurs. C'est-à-dire, les éléments suivants sont une seule et même chose:

String.Format("Hello, {0}! Today is {1}.", "World", "Sunny");
String.Format("Hello, {0}! Today is {1}.", new Object[]{ "World", "Sunny" })

C'est donc la traduction de la votre déclaration d'appel à quelque chose le long des lignes de:

String format = "Another exception occured: {0}";
Object[] args = null;
String.Format(format, args); // throw new ArgumentNullException();

12voto

YYY Points 3216

Dans ton premier exemple, vous sont frapper Format(String, Object), qui ressemble à ceci lorsque démonté:

 public static string Format(string format, object arg0)
 {
    return Format(null, format, new object[] { arg0 });
 }

Remarque l' new object[] autour de cela.

La deuxième, vous êtes apparemment frapper l' Format(string, object[]) d'utilisation, au moins c'est un être invoquée lorsque j'effectue le même test. Démonté, qui ressemble à ceci:

 public static string Format(string format, params object[] args)
 {
     return Format(null, format, args);
 }

Donc, toutes ces réellement obtenir canalisé à l' Format(IFormatProvider, string, object[]). Cool, regardons les premières lignes là:

public static string Format(IFormatProvider provider, string format, params object[] args)
{
    if ((format == null) || (args == null))
    {
        throw new ArgumentNullException((format == null) ? "format" : "args");
    }
...
}

...welp, il est votre problème, là! Le premier appel est en l'enveloppant dans un nouveau tableau, il n'est donc pas nulle. En passant null explicitement ne pas le faire le faire, en raison de l'instance spécifique d' Format() qui appelle.

2voto

RossFabricant Points 7745

Le premier appel est résolu comme un appel à Format(objet), tandis que le second est résolu comme un appel à Format(object[]). Null paramètres sont gérés différemment par ces différentes surcharges.

Résolution de surcharge est décrit ici. La partie pertinente est que, pour la deuxième appel de Format, une surcharge de Format(params object[]) est étendu à Format(object[]), qui est préférée pour le Format(objet). La valeur null littérale est à la fois un objet[] et d'un objet, mais l'objet[] est plus spécifique, de sorte que l'on choisit.

-4voto

Jayaseelan Points 11

Il y a deux différences qui suivent:

  1. Ici, la valeur Null est assignée.

     Exception e = null;
    string msgOne = string.Format("An exception occurred: {0}", e);
     
  2. Ici, la valeur Null ne peut pas être lue au format chaîne, ce qui signifie une erreur de transtypage.

     string msgTwo = string.Format("Another exception occurred: {0}", null);
     

Je vous donne un exemple simple: Ici, vous ne pouvez pas lire la valeur NULL sous forme de chaîne.

 string str = null.toString();
 

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