Guid.Parse () или new Guid () - в чем разница?

79

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

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

или же

var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");
Brennazoon
источник
6
с точки зрения чего?
raym0nd 02
4
Вы также можете использовать: Guid.TryParse ()
Патрик Дежарден

Ответы:

90

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

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;
}
Якуб Конецки
источник
Спасибо за ответ. Я действительно искал, "есть ли разница в том, как они работают".
brennazoon 02
Похоже, есть явная разница в используемом GuidParseThrowStyle, поэтому один может выдать ошибку для ввода, которую другой не будет.
Трийнко
3
@Triynko: Если вы посмотрите на код, вы увидите, что они оба бросают по одним и тем же причинам. Единственное отличие состоит в том, что если OverflowExceptionвыбрано, оно будет инкапсулировано FormatExceptionв случае Guid.Parse.
Лука Кремонези
25

Используйте версию, которая наиболее удобна для чтения. Они реализованы практически одинаково.

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

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

Рид Копси
источник
13

Я пробовал производительность на одном миллионе руководств, и Guid.Parse кажется незначительно быстрее. Это дало разницу в 10-20 миллисекунд на 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 мс

Том Марушка
источник
3
Это не статистически значимый тест. Я запускал это несколько раз и получал разные результаты. Фоновый шум скрывает любые возможные различия в производительности в этих реализациях.
Brad M
1

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

Дэниел А. Уайт
источник
29
Я бы не стал считать это причиной. Есть сценарии, в которых вам нужно исключение, и сценарии, в которых нет. Это больше вопрос выбора подходящего метода в зависимости от сценария.
Дирк Воллмар
+1 с базой данных, которая может иметь пустую строку, это простой способ проанализировать guid и получить Guid.Empty, если строка пуста.
ashes999 06
Я также согласен с @DirkVollmar, что это плохая аргументация. Постоянное TryParseиспользование приводит к массовым проблемам и неверным путям кода. Предпочтительно использовать, Parseкогда вы знаете, что значение должно быть равным a, Guidи быстро вывести из строя, если это не так, чем пытаться обработать полностью неверный сценарий и сделать ваш код более сложным и хрупким.
julealgon
-1

В .Net framework v1.1 существует только 1 способ -> var myguid = new Guid ("9546482E-887A-4CAB-A403-AD9C326FFDA5");

Guid.Parse стал доступен позже.

Александр М
источник
1
Пожалуйста, предоставьте объяснение вместе с решением, чтобы пользователь лучше понимал, что делает код.
Эндрю Риз