2009-08-04 9 views
0

Je crée une section de configuration personnalisée (héritant de System.Configuration.ConfigurationSection), et je me demande si je dois faire de la validation de valeur pour un ConfigurationProperty qui est un int Nullable. À savoir, dois-je faire:Dois-je valider sur une propriété de type Nullable <int>?

[ConfigurationProperty("NullableInt", IsRequired = true)] 
public int? NullableInt 
{ 
    get 
    { 
     return String.IsNullOrEmpty(Convert.ToString(this["NullableInt"])) 
        ? (int?) null 
        : Convert.ToInt32(this["NullableInt"]); 
    } 
    set 
    { 
     this["NullableInt"] = value.HasValue ? Convert.ToString(value) : ""; 
    } 
} 

Ou puis-je faire quelque chose comme ceci:

[ConfigurationProperty("NullableInt", IsRequired = true)] 
public int? NullableInt 
{ 
    get{ return Convert.ToInt32(this["NullableInt"]); } 
    set{ this["NullableInt"] = Convert.ToString(value); } 
} 

Ou est-il une meilleure façon tout ensemble?

Merci d'avance.

Répondre

1

Eh bien, Convert.ToInt32 renverra 0 si la valeur est nulle et il lèvera une exception si l'expression n'est pas numérique .. alors oui, vous voulez la validation! - d'autant plus que vous voulez que la propriété retourne null pour null et non 0 (qui est ce que Convert.ToInt32 retournerait pour null comme indiqué plus haut)

Aussi, il peut être utile de souligner le Int32.Parse() fonction qui est très similaire à Convert.ToInt32() mais qui jette un ArgumentNullException si vous essayez de Parse null - qui est la principale différence entre les Convert.ToInt32 et la Int32.Parse()

+0

Dans ce cas, utiliseriez-vous Int32.Parse() sur Convert.ToInt32()? Je pense que le String.IsNullOrEmpty() va attraper n'importe quel scénario que Int32.Parse() échouerait, n'est-ce pas? –

+0

L'un ou l'autre fonctionne ... cela dépend vraiment de votre objectif ultime mais n'oubliez pas le fait que les convertisseurs jetteront des exceptions quand l'expression n'est pas numérique (ie 'a123bcd') Donc peut-être un try try serait dans l'ordre. .et l'utilisation de Int32.Parse() pour simplifier les choses .. –

1

Le premier est la réponse la plus complète.

La seconde fonctionnera bien dans de nombreux cas, mais échoue sur les cas de bord. Lorsque vous écrivez une section comme celle-ci, vous devez vous assurer des invariants simples de la propriété. A savoir que ce qui suit sera vrai pour toutes les valeurs de int?

int? v1 = GetSomeNullableIntValue(); 
obj.NullableInt = v1; 
int? v2 = obj.NullableInt; 
bool equal = v1 == v2; // Must be true 

Votre deuxième exemple ne constitue pas une telle garantie pour la valeur nulle de int ?. Considérez comment un int null? sera représenté dans ce scénario? Passer dans un int nul? valeur à l'ensemble jettera et ne peut donc jamais être ajouté à la collection. De même, en supposant qu'il était stocké en tant que null ou String.Empty dans la configuration, il ne reviendrait jamais en tant que null int?

+0

Merci, les deux réponses ici vraiment aidé. Marky Miky D a été accepté simplement parce que je l'ai mieux compris, pour une raison quelconque. Probablement manque de café. –