2010-08-11 7 views
7

Quelles sont les meilleures pratiques pour les conversions de type en C#?Quelles sont les meilleures pratiques pour la conversion de type sécurisé en C#?

int temp=System.ConvertToInt32(Request.QueryString["Id"]); 
    if (temp!=null) 
     { // logic goes here } 

échoue si Id s'en quelque sorte à être « abc »

S'il vous plaît conseiller l'utilisation des opérateurs ternaires et d'autres énoncés de ligne unique à part si les déclarations d'autre (comme l'utilisation d'opérateurs ternaires seule ligne). Aussi, préférez-vous TryParse sur Convert & pourquoi? Avez-vous dit les gars.

+1

Temp ne sera jamais nulle dans la chaîne –

Répondre

7

TryParse a l'avantage évident que dans le cas d'échec, il retourne faux au lieu de lancer une exception.

Le modèle standard serait quelque chose comme:

int value; 
if (int.TryParse(Request.QueryString["Id"], out value)) 
{ 
    // Use value 
} 
else 
{ 
    // Do whatever you want on failure 
} 

Maintenant, il est également intéressant compte tenu du fait que vous pouvez donner int.TryParse un IFormatProvider et un NumberStyles - par exemple, vous pouvez bien vouloir préciser CultureInfo.InvariantCulture comme IFormatProvider s'il s'agit vraiment d'un identifiant généré automatiquement (plutôt qu'un identifiant entré par un utilisateur).

Si vous voulez avoir efficacement « valeurs par défaut », vous pouvez écrire une méthode d'aide comme ceci:

public static int? NullableTryParseInt32(string text) 
{ 
    int value; 
    return int.TryParse(text, out value) ? value : (int?) null; 
} 

Vous pouvez ensuite utiliser ce comme ceci:

int value = NullableTryParseInt32(text) ?? 10; 

Ou vous pouvez simplement écrire une méthode qui prend une valeur par défaut, bien sûr :)

+0

Salut Jon, merci pour la réponse. Comment feriez-vous cette déclaration avec un opérateur ternaire? Aussi, n'est-ce pas "out" initialisé chaque fois que j'évalue, correspond ou pas de correspondance? Ne devrions-nous pas éviter tryParse juste à cause de ça? –

+0

@Popo: Oui, le paramètre 'out' est initialisé de toute façon, mais pourquoi éviter' TryParse' à cause de cela? J'ai ajouté quelques autres options pour simplifier cela dans le cas où une valeur par défaut a du sens - mais très souvent, la première forme est vraiment celle qui va avec. –

+0

Merci Jon, TryParse retournerait vrai/faux? Puis-je vérifier les exceptions dans TryParse comme Sunrisas l'a fait en utilisant Convertir? –

0

utilisez la méthode TryParse de la classe int.

int temp; 
if (int.TryParse(Request.QueryString["Id"], out temp) 
    { // logic goes here } 

Si ID ne contient pas de nombre, TryParse renvoie false.

MISE À JOUR: Changé pour montrer int.TryParse

+0

ci-dessus ne semble pas avoir une méthode tryparse pour moi ... Vous êtes sûr que vous ne vouliez pas taper int.TryParse? – Chris

+0

Est-ce que la température n'est pas un problème ici? –

+0

Je pense que vous voulez utiliser int.TryParse il n'y a pas string.TryParse, après tout pourquoi voudriez-vous analyser une chaîne dans une chaîne ;-) –

1

Quand il s'agit de résoudre n'importe quel problème qui a plusieurs solutions similaires, j'essaie aussi de trouver celui qui s'exprime au lecteur du code que j'essaye d'accomplir le cleæret. Dans mon oppinion cela signifie aller pour le .TryParse dans ce cas particulier.

L'utilisation TryParse indique au lecteur que vous n'êtes pas garanti que l'entrée est valide (si vous étiez j'utiliser au lieu d'analyser) Et puisque vous êtes réellement essaie pour analyser l'entrée comme un int vous pourriez aussi bien laissez le code lu ligne vos intentions

1

vous avez deux façons de le faire

int i; 
if (Int32.TryParse(Request.QueryString["Id"], out i)) 
{ 
} 

ou vous pouvez faire:

try 
{ 
    Convert.ToInt32(Request.QueryString["Id"]); 
} 
catch (FormatException ex) 
{ 
    // The field Id it's not convertible 
} 
catch (Exception ex) 
{ 
    // It could throw also ArgumentException or OverflowException 
} 
+0

Salut sinrisas, comment puis-je attraper des exceptions dans tryParse? –

+0

Eh bien, vous pouvez le mettre dans une déclaration try catch. La seule exception que TryParse peut lancer, pour autant que je sache, c'est ArgumentException mais dans ce cas je suppose que vous lui passerez toujours une chaîne, donc vous n'obtiendrez jamais une telle exception. L'idée derrière TryParse n'est pas d'utiliser une instruction try catch, car elle renvoie true ou false en fonction du succès de la conversion –

1

TryParse serait à l'aide de la meilleure option. Attraper l'exception de la méthode convert est une opération coûteuse.Bien sûr, TryParse n'accepterait que des chaînes tandis que Convert.ToInt32 prendrait l'objet et pourrait effectuer des conversions (désemballage, down-casting de long/double) en dehors de l'analyse syntaxique.

1

Pour couvrir l'aspect opérateur ternaire de cette question:

Mon conseil sur l'utilisation des opérateurs ternaires est de ne pas les utiliser si vous n'êtes pas déjà familier avec le code en question qu'il lit naturellement à vous . La concision rend le familier plus familier et l'étranger étrange. Lorsque vous avez assez parlé de TryParse ici pour ne plus avoir à y réfléchir, la conversion de if-else en?: Ne sera pas seulement triviale, elle sera automatique. Jusque-là, vous allez juste ajouter à votre propre confusion. Quand je ne suis pas familier avec quelque chose, je descends au code «bébé-parler» au début, apprends la nouvelle chose, et ensuite l'intègre dans mon style normal plus concis après.

+0

Merci pour le conseil Jon. –

Questions connexes