¿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
OverflowException
se lanza un, se encapsulará en unFormatException
en 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.Empty
antes de intentar el análisis. Sin embargo, el código efectivo es idéntico.Dicho esto, si
Guid
proviene de la entrada del usuario,Guid.TryParse
sería mejor que cualquiera de las opciones. SiGuid
está 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
TryParse
todo el tiempo conduce a problemas masivos y rutas de código inválidas. Es preferible usarloParse
cuando se sabe que el valor se supone que es ayGuid
fallará 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