2011-08-02 12 views
49

¿Cuál es la diferencia entre estas dos formas de convertir una cadena en System.Guid? ¿Hay alguna razón para elegir una sobre la otra?Guid.Parse() o nuevo Guid() - ¿Cuál es la diferencia?

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

o

var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5"); 
+6

en términos de qué? – raym0nd

+3

También puede usar: Guid.TryParse() –

Respuesta

62

Una mirada rápida en el 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; 
} 
+0

Gracias por la respuesta. Realmente estaba buscando "es su diferencia en cómo funcionan". – brennazoon

+0

Parece que hay una clara diferencia en el GuidParseThrowStyle utilizado, por lo que uno podría arrojar un error de entrada que el otro no. – Triynko

+0

@Triynko: Si miras el código, verás que ambos lanzan por las mismas causas. La única diferencia es que si se lanza una 'OverflowException' se encapsulará en una' FormatException' en el caso de 'Guid.Parse'. –

4

Me gustaría ir con TryParse. No arroja una excepción.

+20

No consideraría una razón como tal. Hay escenarios en los que desea una excepción y escenarios en los que no. Es más una cuestión de elegir el método apropiado según el escenario. –

+0

+1 con un DB que podría tener una cadena vacía, esta es una manera fácil de analizar el guid y obtener Guid.Empty si la cadena está vacía. – ashes999

18

Utilice la versión que sea más legible para usted. Los dos se implementan casi exactamente de la misma manera.

La única diferencia real es que el constructor se inicializa en Guid.Empty antes de intentar el análisis. Sin embargo, el código efectivo es idéntico.

Dicho esto, si el Guid proviene de la entrada del usuario, entonces Guid.TryParse sería mejor que cualquiera de las opciones. Si este Guid está codificado, y siempre es válido, cualquiera de las opciones anteriores son perfectamente razonables.

9

Probé el rendimiento en un milion guids y Guid.Parse parece ser un poco más rápido. Hizo una diferencia de 10-20 milisegundos 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 de salida:

nuevo GUID(): 804 ms

Guid.Parse(): 791 ms

Cuestiones relacionadas