web-dev-qa-db-fra.com

Existe-t-il un GUID.TryParse () dans .NET 3.5?

METTRE À JOUR

Guid.TryParse est disponible dans .NET 4.0 

FIN DE MISE À JOUR

Évidemment, il n'y a pas de GUID.TryParse () public dans .NET CLR 2.0.

Donc, je cherchais dans les expressions régulières [alias googler pour en trouver une] et chaque fois que j'en trouvais une, il y avait un débat animé dans la section commentaires à propos de RegEx A ne fonctionnait pas, utilisez RegEx B. Ensuite, quelqu'un écrirait Regex C yadda Yadda

En tout cas, ce que j’ai décidé de faire, c’est ça, mais j’en suis désolé.

public static bool IsGuid (string possibleGuid) {

    try {
      Guid gid = new Guid(possibleGuid);
      return true;    
    } catch (Exception ex) {
      return false;
    }
}

De toute évidence, je n'aime pas vraiment cela, car cela a été foré en moi depuis le premier jour pour éviter de jeter des exceptions si vous pouvez coder de manière défensive autour de cela.

Quelqu'un sait-il pourquoi il n'y a pas de Guid.TryParse () public dans le .NET Framework?

Quelqu'un a-t-il une vraie expression régulière qui fonctionnera pour tous les GUID? 

48
Jack Marchetti

Il n'y a pas de Guid.TryParse dans CLR 2.0 et versions antérieures. Il sera disponible à partir de CLR 4.0 et de Visual Studio 2010.

Quant à pourquoi il n'y en avait pas. Il est généralement difficile de répondre correctement à ces types de questions. Très probablement, il s’agissait d’un problème d’oubli ou de contraintes de temps. Si vous ouvrez mscorlib dans le réflecteur, vous verrez qu'il existe une méthode nommée TryParse sur Guid mais qui est privée. Cela lève également une exception dans certains cas, ce n'est donc pas un bon équivalent à dire Int32.TryParse

55
JaredPar

Guid.TryParse implémentation à l'aide d'expressions régulières.

19
Darin Dimitrov

IsGuid est implémenté comme méthode d'extension pour les chaînes ...

public static bool IsGuid(this string stringValue)
{
   string guidPattern = @"[a-fA-F0-9]{8}(\-[a-fA-F0-9]{4}){3}\-[a-fA-F0-9]{12}";
   if(string.IsNullOrEmpty(stringValue))
     return false;
   Regex guidRegEx = new Regex(guidPattern);
   return guidRegEx.IsMatch(stringValue);
}
10
Partha Choudhury

Cette implémentation de TryParse pour Guids utilise une tentative d’attrape afin d’attraper les Guids mal formés. Il est implémenté en tant que méthode d'extension et doit être placé dans une classe statique:

public static bool TryParseGuid(this string s, out Guid guid)
{
    try {
        guid = new Guid(s);
        return true;
    } catch {
        guid = Guid.Empty;
        return false;
    }
}

On peut appeler avec

string s = "{CA761232-ED42-11CE-BACD-00AA0057B223}";
Guid id;
if (s.TryParseGuid(out id) {
    // TODO: use id
} else {
    // Sorry not a valid Guid.
}

À partir de C # 7.0/Visual Studio 2017, vous pouvez l'appeler avec:

string s = "{CA761232-ED42-11CE-BACD-00AA0057B223}";
if (s.TryParseGuid(out Guid id) {
    // TODO: use id
} else {
    // Sorry not a valid Guid.
}

METTRE À JOUR

Depuis Visual Studio 2010/.NET Framework 4.0, System.Guid fournit une méthode TryParse et une méthode TryPareExact.

Pourquoi n'y en a-t-il pas? C'est un oubli. Il y aura un Guid.TryParse dans .NET 4 (voir Article de blog BCL pour plus de détails).

5
bdukes

À ce que je sache, il n'y a pas de fonctionnalité TryParse dans le .NET Framework. Vous devrez recourir à RegEx ou à l'option try-catch. RegEx n'est pas ma tasse de thé, alors je suis sûr que quelqu'un d'autre postera une réponse.

Les exceptions coûtent cher en termes de performances, mon vote va donc vers l'option RegEx.

0

Cela devrait fonctionner:

@"^\{?[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}\}?$"
0
jheddings

Vous pouvez écrire votre propre TryParse en tant que méthode d'extension pour Guid. Ensuite, lorsque le «vrai» de MS apparaît, vous êtes déjà prêt à partir et vous n’avez pas à changer.

0
ryber