Ich möchte versuchen, einen String in einen Guid zu konvertieren, möchte mich aber nicht darauf verlassen, Ausnahmen abzufangen (
- Aus Leistungsgründen sind Ausnahmen teuer
- Aus Gründen der Benutzerfreundlichkeit wird der Debugger angezeigt
- aus gestalterischen Gründen - das Erwartete ist keine Ausnahme
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 umwickelt werden kann, macht es die Klammer, keine umwickelt, schwierig.
Außerdem dachte ich, dass bestimmte Guid-Werte ungültig sind (?)
Update 1
ChristianK hatte eine gute Idee, nur FormatException
alle und nicht alle zu fangen . Das Codebeispiel der Frage wurde geändert, um Vorschläge einzuschließen.
Update 2
Warum sich über ausgelöste Ausnahmen Gedanken machen? Erwarte ich wirklich so oft ungültige GUIDs?
Die Antwort lautet ja . Deshalb habe ich TryStrToGuid bin mit - ich bin erwartete schlechte Daten.
Beispiel 1 Namespace-Erweiterungen können durch Anhängen einer GUID an einen Ordnernamen angegeben werden . Möglicherweise analysiere ich Ordnernamen und überprüfe, ob der Text nach dem Finale angezeigt wird . 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, der die Gültigkeit einiger zurückgesendeter Daten überprüfen möchte. Ich möchte nicht, dass ungültige Daten Ressourcen um 2-3 Größenordnungen höher binden, als es sein muss.
Beispiel 3 Ich analysiere möglicherweise 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
ps Ich sollte keine Frage rechtfertigen müssen.
4.0
. Deshalb sind die Frage und die akzeptierte Antwort so, wie sie sind.