2011-11-01 178 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)相同,因此这可以解释您所看到的行为。