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

6
з точки зору чого?
raym02

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

Схоже, існує чітка різниця у використаному GuidParseThrowStyle, тому один може викликати помилку для введення, а інший - ні.
Трійко

3
@Triynko: Якщо ви подивитесь на код, то побачите, що вони обидва кидають з однакових причин. Єдина відмінність полягає в тому, що якщо OverflowExceptionвикинути a, він буде інкапсульований FormatExceptionу випадку Guid.Parse.
Luca Cremonesi

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

І вихід:

новий напрям (): 804 мс

Guid.Parse (): 791 мс


3
Це не є статистично значущим еталоном. Я запускав це кілька разів і отримував різні результати. Фоновий шум затьмарює можливі відмінності продуктивності в цих реалізаціях.
Brad M

1

Я пішов би з TryParse. Це не є винятком.


29
Я б не вважав це причиною як такою. Є сценарії, коли ви хочете виключити ситуацію, і сценарії, коли ви цього не робите. Це більше питання вибору відповідного методу залежно від сценарію.
Dirk Vollmar

+1 з db, який може мати порожній рядок, це простий спосіб проаналізувати керівництво та отримати Guid.Empty, якщо рядок порожній.
ashes999

Я також погоджуюсь з @DirkVollmar, що це погані міркування. Постійне TryParseвикористання призводить до величезних проблем та неправильних шляхів коду. Бажано використовувати, Parseколи ви знаєте, що значення має бути, Guidі швидко не вдасться, якщо це не так, ніж спробувати обробити абсолютно недійсний сценарій і зробити ваш код більш складним і крихким.
julealgon

-1

У .Net framework v1.1 існує лише 1 спосіб -> var myguid = new Guid ("9546482E-887A-4CAB-A403-AD9C326FFDA5");

Guid.Parse став доступним пізніше.


1
Будь ласка, надайте пояснення разом із рішенням, щоб користувач краще розумів, що робить код.
Ендрю Різ,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.