Guid全是0(零)?

Did*_*xis 224 .net c# wcf web-services guid

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

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = new Guid()
});
Run Code Online (Sandbox Code Playgroud)

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

00000000-0000-0000-0000-000000000000

可能是什么导致了这个?

Mar*_*ers 403

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

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

  • +1表示正确答案以及指向正确文档的链接. (17认同)

Eri*_*ert 107

从中吸取教训:

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

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

  • @configurator:确实如此.实际上,编译器的"default(S)"和"new S()"的内部表示是相同的; 我们不会在内部区分它们,这导致了多年来的一些不幸的错误,因为它们实际上并非*完全相同.例如,`const int x = new int();`根据规范不应该是合法的,但`const int x = default(int);`是; 我们允许两者. (8认同)
  • 它是否与`default(S)`编译成相同的IL?还是有任何微妙的缺失? (3认同)

Joh*_*hnD 56

试试这个:

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

这将生成一个"真正的"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
Run Code Online (Sandbox Code Playgroud)

比较这与使用int做同样的事情:

int i1;                     // i1 is 0
int i2 = new int();         // i2 is 0
int i3 = default(int);      // i3 is 0
Run Code Online (Sandbox Code Playgroud)

  • 它将按原样编译,但它没有定义的值.如果添加读取它的代码(在写入之前),它将不再编译. (3认同)
  • 第一个示例的第 4 行 'Guid = *new* Guid.NewGuid()' 中有太多的 'new'。它一定是在编辑中结束的,因为我不敢相信有人花了 8 年的时间才注意到这一点。我认为下一段有问题,“当你‘新建’一个引用类型时,它会给你默认值”。Guid 是一种值类型。 (2认同)

Dyl*_*ith 22

尝试做:

Guid foo = Guid.NewGuid();
Run Code Online (Sandbox Code Playgroud)


Mat*_*wdy 19

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

Guid myGuid = Guid.NewGuid(); 
Run Code Online (Sandbox Code Playgroud)


Ada*_*son 11

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

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