文字列をSystem.Guid
に変換するこれら2つの方法の違いは何ですか?どちらかを選択する理由はありますか?
var myguid = Guid.Parse("9546482E-887A-4CAB-A403-AD9C326FFDA5");
または
var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");
リフレクターをざっと見てみると、どちらもほぼ同等であることがわかります。
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
がハードコーディングされており、常に有効な場合、上記のいずれかが完全に妥当なオプションです。
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
TryParse
を使用します。例外をスローしません。