web-dev-qa-db-fra.com

Guid.Parse () ou nouveau Guid () - Quelle est la différence?

Quelle est la différence entre ces deux façons de convertir une chaîne en System.Guid? Y a-t-il une raison de choisir l'un plutôt que l'autre?

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

ou

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

Un rapide coup d'œil dans le réflecteur révèle que les deux sont à peu près équivalents.

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;
}
79
Jakub Konecki

Utilisez la version la plus lisible pour vous. Les deux sont implémentés presque exactement de la même manière.

La seule vraie différence est que le constructeur s'initialise sur Guid.Empty avant de tenter l'analyse. Cependant, le code effectif est identique.

Cela étant dit, si le Guid provient d'une entrée utilisateur, alors Guid.TryParse serait mieux que l'une ou l'autre option. Si ce Guid est codé en dur et toujours valide, l'une des options ci-dessus est parfaitement raisonnable.

23
Reed Copsey

J'ai essayé les performances sur un million de guides et Guid.Parse semble être un peu plus rapide. Cela a fait 10-20 millisecondes de différence de 800 millisecondes de création totale sur mon 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);
    }
}

Et sortie:

nouveau Guid (): 804 ms

Guid.Parse (): 791 ms

11
tom.maruska

J'irais avec TryParse. Cela ne fait pas exception.

1
Daniel A. White