web-dev-qa-db-ja.com

Guid.Parse()またはnew Guid()-違いは何ですか?

文字列をSystem.Guidに変換するこれら2つの方法の違いは何ですか?どちらかを選択する理由はありますか?

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

または

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

リフレクターをざっと見てみると、どちらもほぼ同等であることがわかります。

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

最も読みやすいバージョンを使用してください。 2つはほぼ同じ方法で実装されます。

唯一の本当の違いは、構文解析を試みる前に、コンストラクターがGuid.Emptyに自身を初期化することです。ただし、有効なコードは同じです。

つまり、Guidがユーザー入力からのものである場合、Guid.TryParseはどちらのオプションよりも優れています。このGuidがハードコーディングされており、常に有効な場合、上記のいずれかが完全に妥当なオプションです。

23
Reed Copsey

1つのミリオンガイドでパフォーマンスを試してみましたが、Guid.Parseの速度はわずかです。それは私のPCでの作成で合計800ミリ秒の10-20ミリセコドの差をもたらしました。

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 ms

11
tom.maruska

TryParseを使用します。例外をスローしません。

1
Daniel A. White