Guid - это все 0 (нули)?

Я тестирую некоторые службы WCF, которые отправляют объекты с GUID туда и обратно. В моем тестовом коде веб-приложения я делаю следующее:

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

по какой-то причине вызов новый Guid () генерирует GUID со всеми 0 (нулями), как это:

00000000-0000-0000-0000-000000000000

что может быть причиной этого?

6 ответов


используйте статический метод Guid.NewGuid() вместо вызова конструктора по умолчанию.

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

извлечь уроки из этого:

1) Guid-это тип значения, а не ссылочный тип.

2) вызов конструктора по умолчанию new S() на любом типе значения всегда возвращает вам нулевую форму этого типа значения, независимо от того, что это такое. Логически это то же самое, что default(S).


попробуйте это вместо этого:

 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 i1;                     // i1 is 0
int i2 = new int();         // i2 is 0
int i3 = default(int);      // i3 is 0

попробуйте:

Guid = Guid.NewGuid();

Не могу сказать сколько раз это поймал. мне.

Guid myGuid = Guid.NewGuid(); 

в духе быть полным, ответы, которые инструктируют вас использовать Guid.NewGuid() правильные.

при обращении к вашему последующему редактированию вам нужно будет опубликовать код для вашего RequestObject класса. Я подозреваю, что ваше свойство guid не помечено как DataMember, и, таким образом, не сериализуется по проводу. С default(Guid) это то же самое, что new Guid() (т. е. 0 ' s), это объяснило бы поведение, которое вы видите.