2011-12-29 7 views
8

可能性の重複:
Are automatically generated GUIDs for types in .NET consistent?Type.GUIDは、コンパイルの各タイプを一意に識別しますか?

私はキーの辞書としてTypeを使用したいが、私はむしろ、完全なタイプ名またはType.GUIDのいずれかを使用すると思います。この作業の信頼性と正確性はどれくらいですか?Type.GUID

Ayende Rahienは書いている:

あなたは安定していることがSystem.Type.GUIDに頼ることはできますか?

安定しているということは、同じタイプのコンパイルで同じ値を生成することを意味します。実証的証拠は、次の要因はタイプのGUIDを決定し、これが事実であることを示唆している:

  • (名前空間を含む)タイプ名
  • アセンブリ名を
  • 国会に公開鍵

をシステムに反映させると、System.Type.GUIDは であり、最終的にSystem.RuntimeType.GetGUIDへの呼び出しに変換されます。これは に直接実装されている怖いInternallCallメソッドの1つですランタイム自体。

私はそれがあなたの辞書のキーとしてType.GUID使用して問題を作成していないと思います

答えて

4

http://msdn.microsoft.com/en-us/library/system.type.guid.aspxのドキュメントから。

Type.GUIDの目的は、[Guid("...")]を使用してクラスに関連付けられた値を取得することです。ただし、この属性が関連付けられていない場合は、guidも返します。問題はそれが得られるところです。小さなテストはguidが安定していることを示します。私はクラスのguidをチェックし、クラスの名前を変更したときに変更されたことを確認しました。クラスの名前を変更すると、元のGUIDが再び取得されました。しかし、これらのguidは薄い空気の中に現れるので、時間、リリース、フレームワークのバージョンなどで安定していると信じてはいけません。

1

...だろうか。 Guidが信頼できない場合は、ほとんどのCOMコンポーネントが機能していないはずです。

+0

これを確認するソースを指摘できますか? – Oded

3

使用しないでください。 ideone.comでテスト

typeof(byte).GUID 
00000000-0000-0000-0000-000000000000 

typeof(int).GUID 
00000000-0000-0000-0000-000000000000 

typeof(short).GUID 
00000000-0000-0000-0000-000000000000 

、彼らはモノラル2.8

EDIT実行します。様々な(大きな)のアセンブリにするSystem.Reflectionを使用した後、私は2つのGUIDの間の衝突を見つけることができませんでしたを。だから 0-GUIDの問題はMono-specificです。

+0

どのような条件の下でですか?どのようなCLRのバージョンですか?私の場合(.NET 4はLINQpadを使用しています)、ゼロ以外の結果が得られますが、異なるプログラム全体が実行されます。 –

+0

私も非ゼロ(.Net 4、シンプルなコンソールアプリ)を得ます。 – ken2k

+0

なぜ私は異なるGUIDを持っていますか?どのようにすべてゼロを得ましたか? –

2

Type.FullNameまたはType.AssemblyQualifiedNameはあなたのニーズに合っています。また、GUID(不明なGUIDと比較して意味のある型名)に比べて多くのデバッグを簡略化します。

もう1つの点は、GUIDプロパティは十分に文書化されていないようですので、私はそれに頼ることはありません。

EDITTypeインスタンス自体をキーとして使用することもできます。

1

GUIDを毎回検索するか、GuidAttributeクラスを使用して静的にGUIDを設定する必要があります。あなたは保証されていない行動に決して頼るべきではありません。

関連する問題