Guid全是0(零)?

时间:2011-11-01 19:59:48

标签: c# .net wcf web-services guid

我正在测试一些WCF服务,它们来回传送带有Guids的对象。在我的网络应用测试代码中,我正在执行以下操作:

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

出于某种原因,对新Guid()的调用正在生成Guids,其全部为0(零),如下所示:

00000000-0000-0000-0000-000000000000

导致这种情况的原因是什么?

6 个答案:

答案 0 :(得分:390)

使用静态方法Guid.NewGuid()而不是调用默认构造函数。

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

答案 1 :(得分:104)

从中吸取教训:

1)Guid是值类型,而不是引用类型。

2)在任何值类型上调用默认构造函数new S()总是会返回该值类型的全零形式,无论它是什么。它在逻辑上与default(S)相同。

答案 2 :(得分:55)

请改为尝试:

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

这将生成一个“真正的”Guid值。当你新建一个引用类型时,它会给你默认值(在这种情况下,对于Guid来说都是零)。

当你创建一个新的Guid时,它会将它初始化为全零,这是Guid的默认值。它与创建“new”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

答案 3 :(得分:20)

尝试做:

Guid foo = Guid.NewGuid();

答案 4 :(得分:17)

不能告诉你这次抓到了多少次。我

Guid myGuid = Guid.NewGuid(); 

答案 5 :(得分:10)

本着完成的精神,指示您使用Guid.NewGuid()的答案是正确的。

在处理后续编辑时,您需要发布RequestObject课程的代码。我怀疑你的guid属性没有标记为DataMember,因此没有通过网络进行序列化。由于default(Guid)new Guid()相同(即所有0),这可以解释您所看到的行为。