web-dev-qa-db-ja.com

ガイドはすべて0(ゼロ)ですか?

Guidsを使用してオブジェクトをやり取りするWCFサービスをテストしています。私のWebアプリのテストコードでは、次のことを行っています。

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = new Guid()
});

何らかの理由で、new Guid()の呼び出しは、すべて0(ゼロ)のGuidを生成しています:

00000000-0000-0000-0000-000000000000

これは何が原因ですか?

213
Didaxis

デフォルトのコンストラクターを呼び出す代わりに、静的メソッド Guid.NewGuid() を使用します。

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = Guid.NewGuid()
});
390
Mark Byers

これから学ぶべき教訓:

1)GUIDは値型であり、参照型ではありません。

2)任意の値型でデフォルトコンストラクターnew S()を呼び出すと、常に、その値型のすべてゼロの形式が返されます。論理的にはdefault(S)と同じです。

104
Eric Lippert

代わりにこれを試してください:

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
55
JohnD

やってみてください:

Guid foo = Guid.NewGuid();
20
Dylan Smith

これが何回キャッチされたかはわかりません。私。

Guid myGuid = Guid.NewGuid(); 
17
Matt Dawdy

完全であるという精神で、Guid.NewGuid()を使用するように指示する答えは正しいです。

後続の編集に対処するには、RequestObjectクラスのコードを投稿する必要があります。あなたのguidプロパティがDataMemberとしてマークされていないため、ワイヤー経由でシリアル化されていないのではないかと考えています。 default(Guid)new Guid()と同じ(つまり、すべての0の)ため、これは表示されている動作を説明します。

10
Adam Robinson