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.
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.
2 Stimmen
@Jeff wahrscheinlich, weil der OP ihn mehr als 10 Mal bearbeitet hat - siehe Meta im Gemeinschafts-Wiki
3 Stimmen
Bitte suchen Sie auf dieser Seite weiter nach Lösungen mit Guid.TryParse oder Guid.TryParseExact. Mit .NET 4.0 + ist die obige Lösung nicht die eleganteste
1 Stimmen
@dplante Als ich die Frage ursprünglich 2008 stellte, gab es keine
4.0
. Deshalb sind die Frage und die akzeptierte Antwort so, wie sie sind.