Guid.NewGuid () проти нового Guid ()


347

Яка різниця між Guid.NewGuid()і new Guid()?

Який із них кращий?


6
@ClintonWard Я практично новачок у C # та @ Bob2Chiv, я не можу зараз запустити проект і мені було цікаво про нього.
OscarRyz

6
@OscarRyz - для швидкого тестування коду в C # я використовую LinqPad .
DaveShaw

5
Насправді я вважаю, що це питання є актуальним, оскільки це заплутано, і я насправді не "0000000-0000 .." як найкращий дефолт. Я просто зіткнувся з проблемою, коли клієнт не зміг увійти в систему, тому що десь глибоко всередині проекту закликався новий Guid () замість NewGuid ()
Міхель Корніль

3
@DaveShaw - LinQPad - це чудово, і я дуже його використовую. Але я хотів би зазначити, що зараз у Visual Studio є вікно "C # Interactive", яке дуже корисно для таких видів тестів.
Марк Меуер

1
@MichielCornille Просто дізнався про почуття, брато ...
Джинс Пітер,

Відповіді:


583

new Guid() робить "порожній" орієнтир "0" (00000000-0000-0000-0000-000000000000 не дуже корисно).

Guid.NewGuid() робить фактичне керівництво з унікальним значенням, чого ви, мабуть, хочете.


26
Порожній UUID дійсно дуже корисний. Це робить велику особливу цінність.
Джон Ханна

103
З боку, примітка, new Guid()рівнозначна Guid.Empty.
Стів Гуїді

30
@JonHanna Усі посібники мають великі особливі значення. На жаль, порожні мають схильність до зіткнення. Я погоджуюся, що порожні путівники корисні, хоча, як правило, вказують на те, що щось не ініціалізоване.
MarkPflug

5
Порожні дуже корисні, оскільки вони стикаються. Особливе значення, яке не зіткнулося з відомим спеціальним значенням, було б марним.
Джон Ханна

5
Я думаю, ви обидва згодні з тим, що це добре "відоме керівництво" для порівняння, як у випадку вказівки на те, що щось чекає ініціалізації або знаходиться в якомусь іншому відомому стані. Особисто я вважаю за краще використовувати нульове значення, але я можу побачити, що комусь може знадобитися "спеціальне" керівництво в якийсь момент, і все-0 орієнтир - це, мабуть, правило, що найменше може порушити принцип найменшого сюрпризу для майбутніх утримувачів коду.
PeterL

37

Guid.NewGuid() створює новий UUID за допомогою алгоритму, який призначений робити колізії дуже, дуже малоймовірними.

new Guid() створює UUID, який є всіма нулями.

Як правило, ви віддаєте перевагу першому, тому що це сенс UUID (якщо ви, звичайно, не отримуєте його десь із іншого).

Бувають випадки, коли ви дійсно хочете, щоб UUID був повністю нульовим, але в цьому випадку Guid.Emptyабо default(Guid)зрозуміліше ваші наміри, і менше шансів, що хтось прочитає його, очікуючи, що буде створено унікальне значення.

Загалом, new Guid()це не так корисно через цю відсутність ясності, але неможливо мати тип значення, який не має конструктора без параметрів, який повертає значення нулі та нулі.

Редагувати: Насправді можна створити конструктор без параметрів для типу значення, який не встановлює все на нуль та нуль, але ви не можете це зробити в C #, а також правила про те, коли воно буде викликано і коли буде просто будьте створені цілком нульові структури - заплутані, тому це все одно не дуже гарна ідея.


16
Я додам це для розваги. Для 1% шансу зіткнення потрібно створити близько 2 600 000 000 000 000 000 GUID
Clinton Ward

8
@ClintonWard це залежить від того, який алгоритм UUID використовується, але оскільки деякі використовують MAC-адреси, щоб уникнути зіткнень між машинами, а всі використовують коефіцієнт часу, щоб уникнути зіткнень на одній машині, потрібно створити навіть більше, ніж звичайна математика запропонував би. Якщо ви навмисно не обертаєтеся алгоритмом, змінюючи час і не возившись з MAC-адресами, в такому випадку ви повинні отримати його досить швидко - але це навмисне возитися з входами.
Джон Ханна

2
Це був v1 Guid. новіші GUID MS - це V4 і не використовують MAC-адресу як частину генерації GUID. Час все ще є фактором, хоча
Клінтон Уорд

16

[Я розумію, що це стара тема, просто додаю трохи детальніше] Два відповіді Марка та Джона Ханни підсумовують відмінності, хоча це може зацікавити, що

Guid.NewGuid()

Врешті-решт зателефонує CoCreateGuid (COM-виклик на Ole32) (посилання тут ) і фактичну роботу виконує UuidCreate .

Guid.Empty призначений для перевірки, чи містить Guid всі нулі. Це також можна зробити, порівнюючи значення відповідного Посібника з новим Guid ()

Отже, якщо вам потрібен унікальний ідентифікатор , відповідь - Guid.NewGuid ()


-2

Guid.NewGuid(), оскільки він створює GUID за призначенням.

Guid.NewGuid()створює порожній Guidоб’єкт, ініціалізує його за допомогою виклику CoCreateGuidта повертає об’єкт.

new Guid() просто створює порожній GUID (я думаю, всі нулі).

Я здогадуюсь, вони повинні були зробити конструктор загальнодоступним, як Guidце є struct.


5
Який сенс додати відповідь, яка не додає нічого, що вже не існує у відповідях, які існують тут уже роками?
Дінердо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.