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");
Antworten:
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; }
quelle
OverflowException
geworfen wird, er in einemFormatException
Fall von eingekapselt wirdGuid.Parse
.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.Empty
vor dem Versuch der Analyse selbst initialisiert . Der effektive Code ist jedoch identisch.Davon abgesehen, wenn das
Guid
von Benutzereingaben kommt,Guid.TryParse
wäre es besser als jede Option. Wenn diesGuid
fest codiert und immer gültig ist, sind beide oben genannten Optionen durchaus sinnvoll.quelle
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
quelle
Ich würde mit gehen
TryParse
. Es wird keine Ausnahme ausgelöst.quelle
TryParse
führt zu massiven Problemen und ungültigen Codepfaden. Es wird bevorzugt,Parse
wenn Sie wissen, dass der Wert ein Wert sein sollGuid
und 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.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