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

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

217 голосов
/ 01 ноября 2011

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

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

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

00000000-0000-0000-0000-000000000000

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

Ответы [ 6 ]

394 голосов
/ 02 ноября 2011

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

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = Guid.NewGuid()
});
105 голосов
/ 02 ноября 2011

Уроки, которые можно извлечь из этого:

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

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

55 голосов
/ 02 ноября 2011

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

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
20 голосов
/ 02 ноября 2011

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

Guid foo = Guid.NewGuid();
18 голосов
/ 02 ноября 2011

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

Guid myGuid = Guid.NewGuid(); 
10 голосов
/ 02 ноября 2011

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

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

...