Я тестирую некоторые сервисы WCF, которые отправляют объекты с Guids туда и обратно. В тестовом коде моего веб-приложения я делаю следующее:
var responseObject = proxy.CallService(new RequestObject
{
Data = "misc. data",
Guid = new Guid()
});
По какой-то причине вызов new Guid () генерирует Guids со всеми 0 (нулями) следующим образом:
00000000-0000-0000-0000-000000000000
Что может быть причиной этого?
Guid.Empty
Ответы:
Используйте статический метод
Guid.NewGuid()
вместо вызова конструктора по умолчанию.источник
Уроки, которые можно извлечь из этого:
1) Guid - это тип значения, а не ссылочный тип.
2) Вызов конструктора
new S()
по умолчанию для любого типа значения всегда возвращает вам нулевую форму этого типа значения, какой бы она ни была. Это логически так же, какdefault(S)
.источник
default(S)
или есть какие-то тонкости, которые мне не хватает?const int x = new int();
не должно быть законным в соответствии со спецификацией, ноconst int x = default(int);
есть; мы разрешаем оба.Попробуйте это вместо этого:
Это сгенерирует «реальное» значение Guid. Когда вы создаете ссылочный тип, он даст вам значение по умолчанию (в данном случае это все нули для Guid).
Когда вы создаете новый Guid, он инициализирует его всеми нулями, что является значением по умолчанию для Guid. По сути, это то же самое, что и создание «нового» int (тип значения, но вы можете сделать это в любом случае):
Сравните это с тем же, что и с int:
источник
g1
будет компилироваться только как поле, а не как локальная переменная. Также индексы в вашем столбце комментариев не совпадают с той же строкой кодаПопробуйте сделать:
источник
Не могу сказать, сколько раз это поймали. меня.
источник
В духе полноты ответы, которые инструктируют вас использовать
Guid.NewGuid()
, верны.При рассмотрении вашего последующего редактирования вам нужно будет опубликовать код для вашего
RequestObject
класса. Я подозреваю, что ваше свойство guid не помечено какDataMember
и, следовательно, не сериализуется по проводам. Посколькуdefault(Guid)
это то же самое, чтоnew Guid()
(то есть все0
), это объясняет поведение, которое вы видите.источник