web-dev-qa-db-fra.com

Convert.ToInt32 (String) sur String.Empty vs. Null

L'expression Convert.ToInt32(String.Empty) lèvera une exception FormatException car elle ne peut pas analyser une chaîne vide dans une valeur Int32.

Cependant, l'expression Convert.ToInt32(DirectCast(Nothing, String)) dans VB.NET ou Convert.ToInt32((string)null) dans C # analysera le null en une valeur Int32 de zéro.

En creusant dans la source .NET dans Convert.cs, Je vois le code suivant:

public static int ToInt32(String value) {
    if (value == null) 
        return 0;
    return Int32.Parse(value, CultureInfo.CurrentCulture);
}

Cela explique le comportement, mais j'aimerais comprendre pourquoi il a été écrit de cette façon, au lieu de renvoyer un zéro pour une chaîne vide également?

Par exemple, pourquoi n'était-il pas écrit comme suit:

public static int ToInt32(String value) {
    if (String.IsNullOrEmpty(value)) 
        return 0;
    return Int32.Parse(value, CultureInfo.CurrentCulture);
}

(Notez que String.IsNullOrEmpty() et Convert.ToInt32() datent tous les deux de .NET 2.0, peut-être plus tôt.)

Edit: Ma question est très similaire à cette question , mais j'aimerais aussi savoir pourquoi Convert.ToInt32(String.Empty) lève une exception au lieu de renvoyer la valeur par défaut Int32 de 0. (La réponse étant que String.Empty N'est pas la valeur par défaut de String, il n'y a donc pas de corrélation.)

21
MCattle

Je n'ai absolument aucune idée du raisonnement actuel de l'équipe de conception, mais il me semble qu'il pourrait s'agir d'une sorte d '"équivalence de valeur par défaut". Null est la valeur par défaut de la chaîne, il semble donc logique de la convertir en une valeur par défaut int. String.Empty est cependant une chaîne comme toute autre donnée de chaîne non nulle, donc elle devrait être formatée, d'où l'exception.

Je pense que ArgumentNullException aurait été une décision "plus propre", mais je ne sais pas quels problèmes internes peuvent être derrière tout cela ...

Un autre montage:
Là, dans le documentation MSDN, l'un des 5 résultats possibles:

Une conversion réussie. Pour les conversions entre deux types de base différents non répertoriés dans les résultats précédents, toutes les conversions élargies ainsi que toutes les conversions rétrécies qui n'entraînent pas de perte de données réussiront et la méthode renverra une valeur du type de base ciblé.

Il semble que la conversion d'un objet nul en un autre type n'ait aucune raison d'échouer (pas une erreur de format, pas une conversion non prise en charge type), mais un type de valeur tel que int n'a aucune représentation de "no données ", donc une valeur par défaut du type cible est produite.

Une pensée rapide - la conversion "opposée", Convert.ToString(0), ne donne pas null parce que:

  • 0 est une donnée, elle peut être une valeur très valide et importante dans de nombreux cas
  • null n'est pas une représentation de chaîne correcte de 0
7
Honza Brestan