【问题标题】:Guid is all 0's (zeros)?Guid 全为 0(零)?
【发布时间】:2011-12-19 19:19:33
【问题描述】:

我正在测试一些使用 Guid 来回发送对象的 WCF 服务。在我的网络应用测试代码中,我正在执行以下操作:

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

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

00000000-0000-0000-0000-000000000000

这可能是什么原因造成的?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • +1 以获得正确答案以及指向正确文档的链接。
【解决方案2】:

从中吸取的教训:

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

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

【讨论】:

  • 它是否编译成与 default(S) 相同的 IL 或者我遗漏了什么细微之处?
  • @configurator:确实如此。事实上,编译器对“default(S)”和“new S()”的内部表示是一样的;我们没有在内部区分它们,这导致了多年来一些不幸的错误,因为它们实际上并不完全相同。例如,根据规范,const int x = new int(); 不应该是合法的,但 const int x = default(int); 是;我们允许两者。
  • @configurator - 如果您对相关的极端案例感兴趣,也许msmvps.com/blogs/jon_skeet/archive/2008/12/10/… 也会感兴趣。
【解决方案3】:

试试这个:

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = new 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

【讨论】:

  • g1 只会编译为字段而不是局部变量。此外,您的评论列中的索引与代码的同一行不匹配
  • @CodeInChaos:谢谢,修复了 cmets。仅供参考,g1 行确实可以编译...
  • 它将按原样编译,但没有定义值。如果您添加读取它的代码(在写入之前),它将不再编译。
  • 对,好点,使用未初始化的变量会报错,所以值不能使用。
  • 第一个示例的第 4 行 'Guid = new Guid.NewGuid()' 中有一个 'new' 太多。它一定是在编辑中结束的,因为我不敢相信有人花了 8 年才注意到这一点。我认为下一段有问题,“当你‘新建’一个引用类型时,它会给你默认值”。 Guid 是一种值类型。
【解决方案4】:

尝试做:

Guid foo = Guid.NewGuid();

【讨论】:

  • 投反对票的原因:“Guid”是一种类型,但用作变量。
【解决方案5】:

无法告诉你这已经发生了多少次。我。

Guid myGuid = Guid.NewGuid(); 

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-06
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 2011-03-09
      相关资源
      最近更新 更多