Guid.Parse () o nuevo Guid (): ¿cuál es la diferencia?

79

¿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");
brennazoon
fuente
6
en qué terminos ?
raym0nd
4
También puede utilizar: Guid.TryParse ()
Patrick Desjardins

Respuestas:

90

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;
}
Jakub Konecki
fuente
Gracias por la respuesta. Realmente estaba buscando "si hay una diferencia en cómo funcionan".
brennazoon
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
3
@Triynko: Si miras el código, verás que ambos lanzan por las mismas causas. La única diferencia es que si OverflowExceptionse lanza un, se encapsulará en un FormatExceptionen caso de Guid.Parse.
Luca Cremonesi
25

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. Si Guidestá codificado de forma rígida y siempre es válido, cualquiera de las opciones anteriores son opciones perfectamente razonables.

Reed Copsey
fuente
13

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

tom.maruska
fuente
3
Este no es un punto de referencia estadísticamente significativo. Ejecuté esto varias veces y obtuve resultados variables. El ruido de fondo nubla cualquier posible diferencia de rendimiento en estas implementaciones.
Brad M
1

Yo iría con TryParse. No lanza una excepción.

Daniel A. White
fuente
29
No lo 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 adecuado según el escenario.
Dirk Vollmar
+1 con una base de datos que puede 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.
cenizas999
También estoy de acuerdo con @DirkVollmar en que este es un mal razonamiento. Usar TryParsetodo el tiempo conduce a problemas masivos y rutas de código inválidas. Es preferible usarlo Parsecuando se sabe que el valor se supone que es ay Guidfallará 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.
julealgon
-1

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
1
Proporcione una explicación junto con la solución para que el usuario comprenda mejor lo que hace el código.
Andrew Reese