2011-11-01 7 views
173

私は、Guidsで前後にオブジェクトを送信するWCFサービスをテストしています。このようにすべて0(ゼロ)といくつかの理由でGuidはすべて0(ゼロ)ですか?

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

新しいGUID()への呼び出しが生成されたGUID:私のWebアプリのテストコードでは、私は次のことをやっている

00000000-0000-0000-0000-000000000000

この原因は何ですか?

+8

編集後、これはまったく新しい質問です。新しい答えを決定するには、さらに多くの情報が必要です。 –

+0

重複:http://stackoverflow.com/q/7972658/60761 –

+2

質問を変更した編集部分を削除しました。 – Didaxis

答えて

332

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

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

正しい答えと適切なドキュメントへのリンクは+1です。 – ObscureRobot

17

やってみてください。

Guid = Guid.NewGuid(); 
16

はこれがキャッチした回数を伝えることはできません。私。

Guid myGuid = Guid.NewGuid(); 
54

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

Guid = 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 
+0

'g1'はフィールドとしてのみコンパイルされ、ローカル変数としてはコンパイルされません。コメント欄のインデックスもコードの同じ行と一致しません – CodesInChaos

+0

@ CodeInChaos:ありがとう、コメントを修正しました。 FYI、g1行は実際にコンパイルされます... – JohnD

+2

それはそのままコンパイルされますが、定義された値はありません。それを読み込むコードを追加すると(書き込む前に)、それはもはやコンパイルされません。 – CodesInChaos

99

をこれから学ぶべき教訓:

1)Guidは参照型ではなく値型です。

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

+1

これは 'default(S)'と同じILにコンパイルされますか、それとも何か微妙なことがありますか? – configurator

+5

@configurator:そうです。実際、「デフォルト(S)」と「新しいS()」のコンパイラの内部表現は同じです。私たちはそれらを内部的に区別せず、実際にはまったく同じではないため、何年もの不幸なバグにつながっています。たとえば、 'const int x = new int();'は仕様にしたがって合法ではないと思われますが、 'const int x = default(int);'は;我々は両方を許可する。 –

+0

@ configurator - 関連するコーナーケースに興味がある場合は、http://msmvps.com/blogs/jon_skeet/archive/2008/12/10/value-types-and-parameterless-constructors.aspxも同様です興味 – kvb

10

完成を目指して、Guid.NewGuid()を使用するように指示された回答が正しいです。

次の編集に対処するには、RequestObjectクラスのコードを送信する必要があります。あなたのguidプロパティがDataMemberとしてマークされていないと思われています。したがって、ワイヤを介してシリアル化されていません。 default(Guid)new Guid()と同じです(つまり、0のすべて)、これはあなたが見ている動作を説明します。

関連する問題