web-dev-qa-db-ja.com

Guid.NewGuid()と新しいGuid()

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

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

307
OscarRyz

new Guid()は "空の" all-0 guidを作ります(00000000-0000-0000-0000-000000000000はあまり役に立ちません)。

Guid.NewGuid()はあなたがたぶん欲しいと思う、ユニークな値で実際のguidを作ります。

518
MarkPflug

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

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

それがUUIDのポイントであるため、一般的には前者を好むでしょう(もちろん他の場所からそれを受け取っていない限り)。

本当にゼロのUUIDが欲しいというケースもありますが、このケースではGuid.Emptydefault(Guid)があなたの意図をより明確にしています。

全体として、new Guid()はこの明確さの欠如のためにそれほど有用ではありませんが、すべてゼロとnullの値を返すパラメータのないコンストラクタを持たないvalue-typeを持つことは不可能です。

編集:実際には、すべてをゼロやnullに設定しない値型のパラメータなしのコンストラクタを持つことは可能ですが、C#ではできません。作成したall-zero構造体が混乱しやすいので、とにかく良い考えではありません。

37
Jon Hanna

[これは古いスレッドで、もう少し詳細を加えたものだと思います] MarkとJon Hannaによる2つの答えは違いを要約しています。

Guid.NewGuid()

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

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

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

16