Подтвердить что ты не робот

Guid.Parse() или новый Guid() - Какая разница?

В чем разница между этими двумя способами преобразования строки в System.Guid? Есть ли причина выбора одного над другим?

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

или

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

Ответ 1

Быстрый взгляд в рефлекторе показывает, что оба они в значительной степени эквивалентны.

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;
}

Ответ 2

Используйте наиболее читаемую версию. Эти два реализованы почти точно так же.

Единственное реальное отличие состоит в том, что конструктор инициализируется до Guid.Empty перед попыткой разбора. Однако эффективный код идентичен.

При этом, если Guid поступает с пользовательского ввода, то Guid.TryParse будет лучше, чем любая опция. Если этот Guid жестко закодирован и всегда действителен, любой из вышеперечисленных вариантов является вполне разумным.

Ответ 3

Я пробовал работу над одним миллионом, и Guid.Parse кажется незначительным быстрее. Это сделало 10-20 milisecods разницей 800 миллисекунд общего создания на моем ПК.

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);
    }
}

И вывод:

новый Guid(): 804 мс

Guid.Parse(): 791 мс

Ответ 4

Я бы пошел с TryParse. Это не исключение.