189 Stimmen

Testen, ob string eine guid ist, ohne Ausnahmen auszulösen?

Ich möchte versuchen, eine Zeichenkette in eine Guid zu konvertieren, aber ich möchte mich nicht auf das Abfangen von Ausnahmen verlassen (

  • aus Leistungsgründen - Ausnahmen sind teuer
  • aus Gründen der Benutzerfreundlichkeit - der Debugger wird eingeblendet
  • aus 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, mit RegEx, aber da die guid kann Klammer umschlossen, Klammer umschlossen, keine umschlossen, macht es schwer.

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


Aktualisierung 1

ChristianK hatte eine gute Idee, nur FormatException und nicht alle. Das Code-Beispiel in der Frage wurde geändert, um den Vorschlag aufzunehmen.


Aktualisierung 2

Warum sich über ausgelöste Ausnahmen Gedanken machen? Erwarte ich wirklich so oft ungültige GUIDs?

Die Antwort lautet ja . Deshalb verwende ich TryStrToGuid - ich am in Erwartung schlechter Daten.

Beispiel 1 Namespace-Erweiterungen können durch Anhängen einer GUID an einen Ordnernamen angegeben werden . Ich könnte die Ordnernamen analysieren und prüfen, ob der Text nach dem letzten . 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 könnte einen stark genutzten Webserver betreiben, der die Gültigkeit einiger zurückgesendeter Daten überprüfen möchte. Ich möchte nicht, dass ungültige Daten 2-3 Größenordnungen mehr Ressourcen binden als nötig.

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

enter image description here

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


Update 3 - Leistungsvergleiche

Test zur Umwandlung 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 mich für eine Frage nicht rechtfertigen müssen.

0 Stimmen

Ich weiß nicht, die Antwort auf diese ein, aber für was es wert ist, Sie haben Recht, nicht zu wollen, ein Try/Catch-Block hier zu verwenden. Es braucht eine Menge Berechnungen, um die Kosten für das Abfangen einer Ausnahme aufzuwiegen, und try/catch ist nicht für einen normalen Programmablauf geeignet! Natürlich nur, wenn Sie nicht viele Ausnahmen in diesem Code abfangen müssen, es ist nicht wirklich eine große Sache .

7 Stimmen

Warum in aller Welt ist dies ein Gemeinschafts-Wiki?

38 Stimmen

Sie haben Recht, Sie sollten no eine Frage rechtfertigen müssen. Dennoch habe ich die Begründung mit Interesse gelesen (da sie dem Grund, warum ich dies hier lese, sehr ähnlich ist). Also, danke für die tolle Begründung.

0voto

Mike Punkte 153

Mit einer Erweiterungsmethode in C#

public static bool IsGUID(this string text)
{
    return Guid.TryParse(text, out Guid guid);
}

0voto

If TypeOf ctype(myvar,Object) Is Guid then .....

0voto

Stefan Steiger Punkte 72861
Private Function IsGuidWithOptionalBraces(ByRef strValue As String) As Boolean
    If String.IsNullOrEmpty(strValue) Then
        Return False
    End If

    Return System.Text.RegularExpressions.Regex.IsMatch(strValue, "^[\{]?[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}[\}]?$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
End Function

Private Function IsGuidWithoutBraces(ByRef strValue As String) As Boolean
    If String.IsNullOrEmpty(strValue) Then
        Return False
    End If

    Return System.Text.RegularExpressions.Regex.IsMatch(strValue, "^[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}$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
End Function

Private Function IsGuidWithBraces(ByRef strValue As String) As Boolean
    If String.IsNullOrEmpty(strValue) Then
        Return False
    End If

    Return System.Text.RegularExpressions.Regex.IsMatch(strValue, "^\{[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}\}$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
End Function

-1voto

rajquest Punkte 272

Gibt den Guid-Wert aus String zurück. Wenn der Guid-Wert ungültig ist, wird Guid.Empty zurückgegeben. Nullwert kann nicht zurückgegeben werden, da Guid ein Strukturtyp ist.

    /// <summary>
    /// Gets the GUID from string.
    /// </summary>
    /// <param name="guid">The GUID.</param>
    /// <returns></returns>
    public static Guid GetGuidFromString(string guid)
    {
        try
        {
            if (Guid.TryParse(guid, out Guid value))
            {
                return value;
            }
            else
            {
                return Guid.Empty;
            }
        }
        catch (Exception)
        {
            return Guid.Empty;
        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X