Guid.Parse () oder new Guid () - Was ist der Unterschied?

79

Was ist der Unterschied zwischen diesen beiden Konvertierungsmethoden für einen String System.Guid? Gibt es einen Grund, einen über den anderen zu wählen?

var myguid = Guid.Parse("9546482E-887A-4CAB-A403-AD9C326FFDA5");

oder

var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");
brennazoon
quelle
6
in Bezug auf was?
Raym0nd
4
Sie können auch verwenden: Guid.TryParse ()
Patrick Desjardins

Antworten:

89

Ein kurzer Blick in den Reflektor zeigt, dass beide ziemlich gleichwertig sind.

public Guid(string g)
{
    if (g == null)
    {
       throw new ArgumentNullException("g");
    }
    this = Empty;
    GuidResult result = new GuidResult();
    result.Init(GuidParseThrowStyle.All);
    if (!TryParseGuid(g, GuidStyles.Any, ref result))
    {
        throw result.GetGuidParseException();
    }
    this = result.parsedGuid;
}

public static Guid Parse(string input)
{
    if (input == null)
    {
        throw new ArgumentNullException("input");
    }
    GuidResult result = new GuidResult();
    result.Init(GuidParseThrowStyle.AllButOverflow);
    if (!TryParseGuid(input, GuidStyles.Any, ref result))
    {
        throw result.GetGuidParseException();
    }
    return result.parsedGuid;
}
Jakub Konecki
quelle
Danke für die Antwort. Ich war wirklich auf der Suche nach "Ist es ein Unterschied, wie sie funktionieren".
brennazoon
Es sieht so aus, als ob es einen deutlichen Unterschied im verwendeten GuidParseThrowStyle gibt, sodass einer einen Fehler für die Eingabe auslösen kann, den der andere nicht tut.
Triynko
3
@Triynko: Wenn Sie sich den Code ansehen, werden Sie sehen, dass beide aus den gleichen Gründen werfen. Der einzige Unterschied besteht darin, dass wenn ein OverflowExceptiongeworfen wird, er in einem FormatExceptionFall von eingekapselt wird Guid.Parse.
Luca Cremonesi
25

Verwenden Sie die für Sie am besten lesbare Version. Die beiden werden fast genauso implementiert.

Der einzige wirkliche Unterschied besteht darin, dass sich der Konstruktor Guid.Emptyvor dem Versuch der Analyse selbst initialisiert . Der effektive Code ist jedoch identisch.

Davon abgesehen, wenn das Guidvon Benutzereingaben kommt, Guid.TryParsewäre es besser als jede Option. Wenn dies Guidfest codiert und immer gültig ist, sind beide oben genannten Optionen durchaus sinnvoll.

Reed Copsey
quelle
13

Ich habe versucht, Leistung auf einer Million Guids und Guid.Parse scheint eine unbedeutend schnellere zu sein. Es machte 10-20 Milisecods Unterschied von 800 Millisekunden der gesamten Erstellung auf meinem PC.

public class Program
{
    public static void Main()
    {
        const int iterations = 1000 * 1000;
        const string input = "63559BC0-1FEF-4158-968E-AE4B94974F8E";

        var sw = Stopwatch.StartNew();
        for (var i = 0; i < iterations; i++)
        {
            new Guid(input);
        }
        sw.Stop();

        Console.WriteLine("new Guid(): {0} ms", sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (var i = 0; i < iterations; i++)
        {
            Guid.Parse(input);
        }
        sw.Stop();

        Console.WriteLine("Guid.Parse(): {0} ms", sw.ElapsedMilliseconds);
    }
}

Und Ausgabe:

neue Guid (): 804 ms

Guid.Parse (): 791 ms

tom.maruska
quelle
3
Dies ist kein statistisch signifikanter Benchmark. Ich habe das mehrmals ausgeführt und unterschiedliche Ergebnisse erzielt. Das Hintergrundrauschen trübt mögliche Leistungsunterschiede in diesen Implementierungen.
Brad M
1

Ich würde mit gehen TryParse. Es wird keine Ausnahme ausgelöst.

Daniel A. White
quelle
29
Ich würde das nicht als Grund betrachten. Es gibt Szenarien, in denen Sie eine Ausnahme wünschen, und Szenarien, in denen Sie dies nicht tun. Es geht vielmehr darum, je nach Szenario die geeignete Methode auszuwählen.
Dirk Vollmar
+1 mit einer Datenbank, die möglicherweise eine leere Zeichenfolge enthält, ist dies eine einfache Möglichkeit, die Guid zu analysieren und Guid.Empty zu erhalten, wenn die Zeichenfolge leer ist.
Asche999
Ich stimme auch @DirkVollmar zu, dass dies eine schlechte Argumentation ist. Die ständige Verwendung TryParseführt zu massiven Problemen und ungültigen Codepfaden. Es wird bevorzugt, Parsewenn Sie wissen, dass der Wert ein Wert sein soll Guidund schnell fehlschlägt, wenn dies nicht der Fall ist, als zu versuchen, ein vollständig ungültiges Szenario zu behandeln und Ihren Code komplexer und fragiler zu gestalten.
Julealgon
-1

In .Net Framework v1.1 gibt es nur einen Weg -> var myguid = new Guid ("9546482E-887A-4CAB-A403-AD9C326FFDA5");

Guid.Parse wurde später verfügbar.

Александр М
quelle
1
Bitte geben Sie eine Erklärung zusammen mit der Lösung an, damit der Benutzer besser versteht, was der Code tut.
Andrew Reese