Guid.NewGuid()とnew Guid()


346

違いは何ですか Guid.NewGuid()とはnew Guid()

どちらが好ましいですか?


6
@ClintonWard私はC#に慣れていないので、@ Bob2Chiv現在プロジェクトを実行できず、興味がありました。
OscarRyz 2012

6
@OscarRyz-C#でコードをすばやくテストするには、LinqPadを使用します
DaveShaw 2012

5
実際、私はこの質問が関連していると思います。これは混乱を招き、実際には "0000000-0000 .."を最適なデフォルトとして使用しないためです。プロジェクトのどこかでNewGuid()の代わりにnew Guid()が呼び出されたため、クライアントがシステムにログインできないという問題に遭遇しました
Michiel Cornille 2013年

3
@DaveShaw-LinQPadは素晴らしく、私はよく使っています。しかし、Visual Studioには、この種のテストに非常に役立つ「C#Interactive」ウィンドウが備わっていることを指摘しておきたいと思います。
Mark Meuer 2016

1
@MichielCornille気分が良くなることを知った...
Jins Peter

回答:


580

new Guid() 「空」のすべて0のGUIDを作成します(00000000-0000-0000-0000-000000000000はあまり役に立ちません)。

Guid.NewGuid() あなたがおそらく望んでいる、ユニークな値を持つ実際のGUIDを作成します。


26
空のUUIDは非常に便利です。それは大きな特別な価値をもたらします。
Jon Hanna

103
余談ですが、new Guid()と同等Guid.Emptyです。
スティーブギディ

30
@JonHannaすべてのGUIDは、特別な価値を生み出します。残念ながら、空のものは衝突する傾向があります。ただし、空のGUIDは、通常、何かが初期化されていないことを示すのに役立ちます。
MarkPflug 2012

5
空のものは衝突するので非常に便利です。既知の特別な値と衝突しない特別な値は役に立たないでしょう。
ジョンハンナ

5
何かが初期化を待っている、または他の既知の状態にあることを示す場合のように、これは比較に適した「既知のGUID」になることに同意していると思います。個人的にはnull値を使用したいのですが、ある時点で誰かが「特別な」GUIDを必要とする可能性があることがわかります。すべて0のGUIDは、将来のメンテナにとって最小の驚きの原則に違反する可能性が最も低いGUIDですコードの。
PeterL 2012

37

Guid.NewGuid() 衝突をほとんど起こさないように設計されたアルゴリズムを使用して、新しいUUIDを作成します。

new Guid() すべてゼロのUUIDを作成します。

前者の方が一般的ですが、それがUUIDのポイントだからです(もちろん他の場所から受け取っている場合を除きます)。

実際にすべて0のUUIDが必要な場合もありますが、この場合、Guid.Emptyまたはdefault(Guid)意図が明確であり、一意の値が作成されていると予期してそれを読み取る可能性は低くなります。

全部で、 new Guid()この明快さの欠如のためにそれほど有用はありませんが、すべて0とnullの値を返すパラメーターなしのコンストラクターがない値型を持つことはできません。

編集:実際には、すべてをゼロとnullに設定しない値型にパラメーターなしのコンストラクターを設定することは可能ですが、C#では実行できません。また、いつ呼び出されるか、いつ呼び出されるかに関するルール作成されたすべて0の構造体であると混乱を招くので、とにかく良い考えではありません。


16
楽しみのためにこれを追加します。衝突の1%の確率では、約2,600,000,000,000,000,000のGUIDを生成する必要があります
クリントンウォード

8
@ClintonWard使用中のUUIDアルゴリズムに依存しますが、一部はMACアドレスを使用してマシン間の衝突を回避し、すべて同じマシンでの衝突を回避するために時間係数を使用するため、通常の計算よりも多く作成する必要があります提案するでしょう。時間を変更してMACアドレスをいじることによってアルゴリズムを故意にねじ込まない限り、かなり迅速に取得する必要がありますが、それは意図的に入力をいじっています。
Jon Hanna

2
それはv1 Guidでした。新しいMS GUIDはV4であり、GUID生成の一部としてMACアドレスを使用しません。ただし、時間は依然として要因です
クリントンウォード

16

[これは古いスレッドであり、もう少し詳細を追加しているだけだと理解しています] MarkとJon Hannaによる2つの答えは、いくつかの興味を引くかもしれませんが、違いを要約しています

Guid.NewGuid()

最終的にCoCreateGuid(Ole32へのCOM呼び出し)を呼び出します(ここを参照))、実際の作業はUuidCreateによって行われます

Guid.Emptyは、Guidにすべてゼロが含まれているかどうかを確認するために使用されることを意図しています。これは、問題のGuidの値を新しいGuid()

したがって、一意の識別子が必要場合の答えはGuid.NewGuid()です。


-2

Guid.NewGuid()、意図したとおりにGUIDを作成するため。

Guid.NewGuid()空のGuidオブジェクトを作成し、呼び出して初期化しますCoCreateGuidてオブジェクトを返します。

new Guid() 空のGUIDを作成するだけです(すべてゼロと思います)。

私は彼らのようにコンストラクタを公開しなければならなかったと思いますGuidですstruct


5
何年もここにいる回答にまだ存在しないものを追加しない回答を追加する意味は何ですか?
Dinerdo 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.