我正在测试一些WCF服务,它们可以来回发送带有guid的对象。在我的web应用程序测试代码中,我正在做以下事情:

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

由于某些原因,调用new Guid()会生成全为0的Guid,如下所示:

00000000 - the 0000-0000-0000-000000000000

是什么导致了这种情况?


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

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

试着做:

Guid foo = Guid.NewGuid();

我都不知道这病发作过多少次了。我。

Guid myGuid = Guid.NewGuid(); 

试试这个吧:

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

这将生成一个“真实的”Guid值。当您新建引用类型时,它将为您提供默认值(在本例中,Guid为全0)。

当您创建一个新的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

从中可以学到的教训:

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

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

本着完整的精神,指示您使用guide . newguid()的答案是正确的。

在处理后续编辑时,需要发布RequestObject类的代码。我怀疑您的guid属性没有被标记为数据成员,因此没有通过网络序列化。由于default(Guid)与new Guid()相同(即全部为0),这将解释您所看到的行为。