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

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

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

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

00000000-0000-0000-0000-000000000000

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

Ответ 1

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

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

Ответ 2

Уроки, чтобы учиться на этом:

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

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

Ответ 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

Ответ 4

Попробуйте сделать:

Guid = Guid.NewGuid();

Ответ 5

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

Guid myGuid = Guid.NewGuid(); 

Ответ 6

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

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