¿Cuál es la diferencia entre estas dos formas de convertir una cadena en System.Guid? ¿Hay alguna razón para elegir uno sobre el otro?
var myguid = Guid.Parse("9546482E-887A-4CAB-A403-AD9C326FFDA5");
o
var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");
    
Respuestas:
Un vistazo rápido al Reflector revela que ambos son prácticamente equivalentes.
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; }fuente
OverflowExceptionse lanza un, se encapsulará en unFormatExceptionen caso deGuid.Parse.Utilice la versión que le resulte más legible. Los dos se implementan casi exactamente de la misma manera.
La única diferencia real es que el constructor se inicializa
Guid.Emptyantes de intentar el análisis. Sin embargo, el código efectivo es idéntico.Dicho esto, si
Guidproviene de la entrada del usuario,Guid.TryParsesería mejor que cualquiera de las opciones. SiGuidestá codificado de forma rígida y siempre es válido, cualquiera de las opciones anteriores son opciones perfectamente razonables.fuente
Probé el rendimiento en un millón de guías y Guid.Parse parece ser insignificantemente más rápido. Hizo una diferencia de 10-20 milisecods de 800 milisegundos de creación total en mi 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); } }Y salida:
nuevo Guid (): 804 ms
Parámetros guía (): 791 ms
fuente
Yo iría con
TryParse. No lanza una excepción.fuente
TryParsetodo el tiempo conduce a problemas masivos y rutas de código inválidas. Es preferible usarloParsecuando se sabe que el valor se supone que es ayGuidfallará rápidamente si no lo es, que tratar de manejar un escenario completamente inválido y hacer que su código sea más complejo y frágil.En .Net framework v1.1 existe solo 1 vía -> var myguid = new Guid ("9546482E-887A-4CAB-A403-AD9C326FFDA5");
Guid.Parse estuvo disponible más tarde.
fuente