Je veux essayer de convertir une chaîne en Guid, mais je ne veux pas me fier à la capture d'exceptions (
- pour des raisons de performances - les exceptions coûtent cher
- 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 d'utiliser RegEx, mais comme le guid peut être entre parenthèses, entre accolades, aucun enveloppé, cela rend les choses difficiles.
De plus, je pensais que certaines valeurs Guid ne sont pas valides (?)
Mise à jour 1
ChristianK avait une bonne idée d'attraper seulement FormatException
, plutôt que tout. L'échantillon de code de la question a été modifié pour inclure une suggestion.
Mise à jour 2
Pourquoi s'inquiéter des exceptions levées? Est-ce que je m'attends vraiment à des GUID invalides si souvent?
La réponse est oui . Voilà pourquoi je me sers TryStrToGuid - Je me attends de mauvaises données.
Exemple 1 Les extensions d'espace de noms peuvent être spécifiées en ajoutant un GUID à un nom de dossier . Je suis peut-être en train d'analyser les noms de dossiers, de 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 J'exécute peut-être un serveur Web très utilisé qui souhaite vérifier la validité de certaines données postées. Je ne veux pas que des données non valides bloquent des ressources de 2 à 3 ordres de grandeur plus élevées que nécessaire.
Exemple 3 Je suis peut-être en train d'analyser une expression de recherche saisie par un utilisateur.
S'ils entrent des GUID, je veux les traiter spécialement (comme rechercher spécifiquement cet objet, ou mettre en évidence et mettre en forme ce terme de recherche spécifique dans le texte de la réponse.)
Mise à jour 3 - Benchmarks de performance
Testez la conversion de 10 000 bons guides et 10 000 mauvais guides.
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
ps je ne devrais pas avoir à justifier une question.
4.0
. C'est pourquoi la question et la réponse acceptée sont telles qu'elles sont.