Какая разница между Guid.NewGuid()
и new Guid()
?
Какой из них предпочтительнее?
Какая разница между Guid.NewGuid()
и new Guid()
?
Какой из них предпочтительнее?
new Guid()
делает "пустым" all-0 guid (00000000-0000-0000-0000-000000000000 не очень полезно).
Guid.NewGuid()
делает фактический guid с уникальным значением, что вы, вероятно, захотите.
Guid.NewGuid()
создает новый UUID с использованием алгоритма, который предназначен для совершения коллизий очень, очень маловероятно.
new Guid()
создает UUID, который является нулевым.
Как правило, вы предпочтете первое, потому что это точка UUID (если вы не получаете ее откуда-то еще, конечно).
Есть случаи, когда вам действительно нужен UUID с нулевым нулем, но в этом случае Guid.Empty
или default(Guid)
понятнее о ваших намерениях, и там меньше шансов, что кто-то читает его, ожидая уникального значения.
В целом, new Guid()
не так полезен из-за этого отсутствия ясности, но невозможно получить тип значения, у которого нет конструктора без параметров, который возвращает значение all-zeros-and-nulls.
Изменить: на самом деле, можно создать безпараметрический конструктор по типу значений, который не устанавливает все в ноль и нуль, но вы не можете сделать это на С#, а также правила о том, когда он будет вызываться и когда будет только что созданная все ноль структура запуталась, так что это не очень хорошая идея в любом случае.
[Я понимаю, что это старый поток, просто добавив несколько деталей] Два ответа Марка и Джона Ханны подытоживают различия, хотя это может заинтересовать некоторых, что
Guid.NewGuid()
В конце концов вызывает CoCreateGuid (COM-вызов Ole32) (ссылка здесь), а фактическая работа выполняется UuidCreate.
Guid.Empty предназначен для проверки того, содержит ли Guid все нули. Это также можно сделать, сравнив значение рассматриваемого Guid с новым Guid()
Итак, если вам нужен уникальный идентификатор, ответ будет Guid.NewGuid()
Guid.NewGuid(), поскольку он создает GUID, как предполагалось.
Guid.NewGuid() создает пустой объект Guid, инициализирует его, вызывая CoCreateGuid и возвращает объект.
new Guid() просто создает пустой GUID (я думаю, все нули).
Я предполагаю, что они должны были сделать конструктор общедоступным, поскольку Guid - это структура.