Testen Sie, ob die Zeichenfolge eine Guid ist, ohne Ausnahmen auszulösen?

Ich möchte versuchen, einen String in eine Guid umzuwandeln, aber ich möchte mich nicht darauf verlassen, Ausnahmen abzufangen (

aus Performancegründen - Ausnahmen sind teuerAus Gründen der Benutzerfreundlichkeit wird der Debugger angezeigtaus gestalterischen Gründen - das Erwartete ist nicht außergewöhnlich

Mit anderen Worten der Code:

public static Boolean TryStrToGuid(String s, out Guid value)
{
    try
    {
        value = new Guid(s);
        return true;
    }
    catch (FormatException)
    {
        value = Guid.Empty;
        return false;
    }
}

ist nicht geeignet.

Ich würde versuchen, RegEx zu verwenden, aber da die GUID in Klammern gesetzt werden kann, macht es die Verwendung von geschweiften Klammern und nicht geschweiften Klammern schwierig.

Außerdem dachte ich, dass bestimmte Guid-Werte ungültig sind (?)

Update 1

ChristianK hatte nur eine gute idee zu fangenFormatExceptioneher als alle. Das Codebeispiel der Frage wurde so geändert, dass es einen Vorschlag enthält.

Update 2

Warum sollten Sie sich Gedanken über geworfene Ausnahmen machen? Erwarte ich wirklich so oft ungültige GUIDs?

Die Antwort istJa. Deshalb benutze ich TryStrToGuid - Ibin Ich erwarte schlechte Daten.

Beispiel 1 Namespace-Erweiterungen können durch Anhängen einer GUID an einen Ordnernamen angegeben werden. Ich analysiere möglicherweise Ordnernamen und überprüfe, ob der Text nach dem Finale steht. ist eine 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

Beispiel 2 Ich verwende möglicherweise einen stark genutzten Webserver, um die Gültigkeit einiger zurückgesendeter Daten zu überprüfen. Ich möchte nicht, dass ungültige Daten Ressourcen binden, die 2-3 Größenordnungen höher sind als erforderlich.

Beispiel 3 Möglicherweise analysiere ich einen von einem Benutzer eingegebenen Suchausdruck.

Wenn sie GUIDs eingeben, möchte ich sie speziell verarbeiten (z. B. gezielt nach diesem Objekt suchen oder diesen bestimmten Suchbegriff im Antworttext markieren und formatieren).

Update 3 - Leistungsbenchmarks

Testen Sie die Konvertierung von 10.000 guten und 10.000 schlechten 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. Ich sollte keine Frage rechtfertigen müssen.

Antworten auf die Frage(18)

Ihre Antwort auf die Frage