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



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

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

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

00000000-0000-0000-0000-000000000000

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

183   6  

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), это объяснило бы поведение, которое вы видите.

    Ничего не найдено.

Добавить ответ:
Отменить.