2011-11-01 180 views
173

我正在測試一些WCF服務,它使用Guids來回發送對象。在我的web應用程序的測試代碼,我做了以下內容:所有0(零)Guid全爲0(零)?

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

出於某種原因,在調用新的GUID()正在生成的GUID是這樣的:

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的相同行不匹配:謝謝,修正了評論。僅供參考,g1行實際上編譯... – JohnD

+2

它將按原樣編譯,但它沒有定義的值。如果添加了讀取它的代碼(在寫入之前),它將不再編譯。 – CodesInChaos

99

經驗教訓:

1)Guid是一個值類型,而不是一個引用類型。 2)在任何值類型上調用默認構造函數new S()總是會返回該值類型的全零形式,無論它是什麼。它在邏輯上與default(S)相同。

+1

它是否編譯成與'default(S)'相同的IL?還是我有什麼微妙之處? – configurator

+5

@configurator:它的確如此。實際上,編譯器內部表示「default(S)」和「new S()」是相同的;我們不會在內部區分它們,這些年來導致了一些不幸的錯誤,因爲它們實際上並不完全相同。例如,'const int x = new int();'根據規範不應該是合法的,但'const int x = default(int);'is;我們允許兩者。 –

+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)相同,因此這可以解釋您所看到的行爲。