2011-08-02 29 views
49

文字列をSystem.Guidに変換する2つの方法の違いは何ですか?どちらかを選ぶ理由はありますか?Guid.Parse()またはnew Guid() - 違いは何ですか?

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

または

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

? – raym0nd

+3

また、以下を使用することもできます:Guid.TryParse() –

答えて

62

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

お返事ありがとうございます。私は本当に「彼らの仕事の仕方に違いがあるか」を探していました。 – brennazoon

+0

使用されたGuidParseThrowStyleには明確な違いがあるように見えます。 – Triynko

+0

@Triynko:コードを見ると、両方とも同じ理由で投げられることがわかります。唯一の違いは、 'OverflowException'がスローされた場合、' Guid.Parse'の場合に 'FormatException'にカプセル化されることです。 –

4

私はTryParseとなるだろう。例外をスローしません。

+20

私はそれを理由として考えません。あなたが例外とシナリオを必要としないシナリオがあります。シナリオに応じて適切な方法を選択することがより重要になります。 –

+0

空の文字列を持つ可能性のあるdbを+1すると、guidを解析し、文字列が空の場合はGuid.Emptyを取得する簡単な方法です。 – ashes999

18

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

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

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

9

私は1 milion guidsと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ミリ秒かの点で、

関連する問題