Guidsを使用してオブジェクトをやり取りするWCFサービスをテストしています。私のWebアプリのテストコードでは、次のことを行っています。
var responseObject = proxy.CallService(new RequestObject
{
Data = "misc. data",
Guid = new Guid()
});
何らかの理由で、new Guid()の呼び出しは、すべて0(ゼロ)のGuidを生成しています:
00000000-0000-0000-0000-000000000000
これは何が原因ですか?
デフォルトのコンストラクターを呼び出す代わりに、静的メソッド Guid.NewGuid()
を使用します。
var responseObject = proxy.CallService(new RequestObject
{
Data = "misc. data",
Guid = Guid.NewGuid()
});
これから学ぶべき教訓:
1)GUIDは値型であり、参照型ではありません。
2)任意の値型でデフォルトコンストラクターnew S()
を呼び出すと、常に、その値型のすべてゼロの形式が返されます。論理的にはdefault(S)
と同じです。
代わりにこれを試してください:
var responseObject = proxy.CallService(new RequestObject
{
Data = "misc. data",
Guid = new Guid.NewGuid()
});
これにより、「実際の」Guid値が生成されます。参照タイプを新規作成すると、デフォルト値(この場合、Guidの場合はすべてゼロ)が提供されます。
新しいGuidを作成すると、すべてのゼロに初期化されます。これは、Guidのデフォルト値です。基本的に「新しい」intを作成するのと同じです(値型ですが、とにかくこれを行うことができます)。
Guid g1; // g1 is 00000000-0000-0000-0000-000000000000
Guid g2 = new Guid(); // g2 is 00000000-0000-0000-0000-000000000000
Guid g3 = default(Guid); // g3 is 00000000-0000-0000-0000-000000000000
Guid g4 = Guid.NewGuid(); // g4 is not all zeroes
これを、intで同じことを行うことと比較してください。
int i1; // i1 is 0
int i2 = new int(); // i2 is 0
int i3 = default(int); // i3 is 0
やってみてください:
Guid foo = Guid.NewGuid();
これが何回キャッチされたかはわかりません。私。
Guid myGuid = Guid.NewGuid();
完全であるという精神で、Guid.NewGuid()
を使用するように指示する答えは正しいです。
後続の編集に対処するには、RequestObject
クラスのコードを投稿する必要があります。あなたのguidプロパティがDataMember
としてマークされていないため、ワイヤー経由でシリアル化されていないのではないかと考えています。 default(Guid)
はnew Guid()
と同じ(つまり、すべての0
の)ため、これは表示されている動作を説明します。