Je veux essayer de convertir une chaîne de caractères en Guid, mais je ne veux pas compter sur la capture des exceptions (
- pour des raisons de performance - les exceptions sont coûteuses
- pour des raisons de convivialité, le débogueur apparaît.
- pour des raisons de conception - l'attendu n'est pas exceptionnel
En d'autres termes, le code :
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
ne convient pas.
J'essaierais bien d'utiliser RegEx, mais comme le guidon peut être enveloppé de parenthèses, d'accolades ou non, c'est difficile.
De plus, je pensais que certaines valeurs Guid sont invalides ( ?).
Mise à jour 1
ChristianK a eu la bonne idée d'attraper seulement FormatException
plutôt que tous. Modification de l'exemple de code de la question pour inclure la suggestion.
Mise à jour 2
Pourquoi s'inquiéter des exceptions levées ? Est-ce que je m'attends vraiment à des GUIDs invalides si souvent ?
La réponse est oui . C'est pourquoi j'utilise TryStrToGuid. Je suis s'attendant à de mauvaises données.
Exemple 1 Les extensions d'espace de nommage peuvent être spécifiées en ajoutant un GUID au nom d'un dossier. . Je pourrais analyser les noms de dossiers, vérifier si le texte après la finale . est un GUID.
c:\Program Files
c:\Program Files.old
c:\Users
c:\Users.old
c:\UserManager.{CE7F5AA5-6832-43FE-BAE1-80D14CD8F666}
c:\Windows
c:\Windows.old
Exemple 2 Il se peut qu'un serveur web très utilisé veuille vérifier la validité de certaines données renvoyées. Je ne veux pas que des données non valides accaparent des ressources supérieures de 2 ou 3 ordres de grandeur à ce qu'elles devraient être.
Exemple 3 Je pourrais analyser une expression de recherche entrée par un utilisateur.
S'ils saisissent des GUID, je veux les traiter spécialement (par exemple en recherchant spécifiquement cet objet, ou en mettant en évidence et en formatant ce terme de recherche spécifique dans le texte de la réponse).
Mise à jour 3 - Critères de performance
Test de conversion de 10 000 bons Guids, et 10 000 mauvais Guids.
Catch FormatException:
10,000 good: 63,668 ticks
10,000 bad: 6,435,609 ticks
Regex Pre-Screen with try-catch:
10,000 good: 637,633 ticks
10,000 bad: 717,894 ticks
COM Interop CLSIDFromString
10,000 good: 126,120 ticks
10,000 bad: 23,134 ticks
p.s. Je ne devrais pas avoir à justifier une question.
0 votes
Je ne connais pas la réponse à cette question, mais pour ce que ça vaut, vous avez raison de ne pas vouloir utiliser un bloc try/catch ici. Il faut beaucoup de calculs pour compenser le coût de la capture d'une exception et le bloc try/catch n'est pas fait pour le déroulement normal du programme ! Bien sûr, si vous ne devez pas attraper beaucoup d'exceptions dans ce code, ce n'est pas vraiment un problème .
7 votes
Pourquoi diable est-ce un wiki communautaire ?
36 votes
Vous avez raison, vous devriez no doivent justifier une question. Cependant, j'ai lu la justification avec intérêt (car elle est très similaire à la raison pour laquelle je suis ici en train de lire ceci). Donc, merci pour cette excellente justification.
2 votes
@Jeff probablement parce que le PO l'a édité plus de 10 fois - cf. méta sur le wiki communautaire
3 votes
Veuillez continuer à chercher sur cette page des solutions avec Guid.TryParse ou Guid.TryParseExact. Avec .NET 4.0 +, la solution ci-dessus n'est pas la plus élégante.
1 votes
@dplante Quand j'ai posé la question en 2008, il n'y avait pas de
4.0
. C'est pourquoi la question, et la réponse acceptée, sont telles qu'elles sont.