Guid.NewGuid () so với Guid mới ()


346

Sự khác biệt giữa Guid.NewGuid()và là new Guid()gì?

Cái nào được ưa thích?


6
@ClintonWard Tôi thực sự mới đối với C # và @ Bob2Chiv Tôi không thể chạy dự án ngay bây giờ và tò mò về nó.
OscarRyz

6
@OscarRyz - Để nhanh chóng kiểm tra mã trong C #, tôi sử dụng LinqPad .
DaveShaw

5
Trên thực tế tôi tin rằng câu hỏi này có liên quan, bởi vì nó khó hiểu và tôi thực sự không "0000000-0000 .." là mặc định tốt nhất. Tôi vừa gặp phải một vấn đề trong đó khách hàng không thể đăng nhập vào hệ thống vì ở đâu đó sâu bên trong dự án, Guid () mới được gọi thay vì NewGuid ()
Michiel Cornille

3
@DaveShaw - LinQPad rất tuyệt và tôi sử dụng nó rất nhiều. Nhưng tôi muốn chỉ ra rằng Visual Studio hiện có cửa sổ "C # Interactive" rất hữu ích cho các loại thử nghiệm này.
Mark Meuer

1
@MichielCornille Chỉ cần biết cảm giác ...
Jins Peter

Câu trả lời:


580

new Guid() làm cho một hướng dẫn "0" trống rỗng (00000000-0000-0000-0000-000000000000 không hữu ích lắm).

Guid.NewGuid() làm cho một hướng dẫn thực tế với một giá trị duy nhất, những gì bạn có thể muốn.


26
Một UUID trống thực sự rất hữu ích. Nó làm cho một giá trị đặc biệt lớn.
Jon Hanna

103
Trên một lưu ý phụ, new Guid()tương đương với Guid.Empty.
Steve Guidi

30
@JonHanna Tất cả các hướng dẫn làm cho giá trị đặc biệt lớn. Thật không may, những cái trống có xu hướng va chạm. Tôi đồng ý rằng các hướng dẫn trống rỗng rất hữu ích, thông thường để chỉ ra rằng một cái gì đó chưa được khởi tạo.
MarkPflug

5
Những cái trống rất hữu ích vì chúng va chạm. Một giá trị đặc biệt không va chạm với giá trị đặc biệt đã biết sẽ là vô ích.
Jon Hanna

5
Tôi nghĩ rằng cả hai bạn đều đồng ý rằng nó tạo ra một "hướng dẫn đã biết" tốt để so sánh với, như trong trường hợp chỉ ra một cái gì đó đang chờ khởi tạo hoặc đang ở một số trạng thái đã biết khác. Cá nhân tôi muốn sử dụng một giá trị null, nhưng tôi có thể thấy rằng ai đó có thể cần một hướng dẫn "đặc biệt" tại một số điểm và hướng dẫn all-0 có lẽ là hướng dẫn ít có khả năng vi phạm hiệu trưởng ít gây bất ngờ nhất cho những người duy trì trong tương lai của mã.
PeterL

37

Guid.NewGuid() tạo một UUID mới bằng thuật toán được thiết kế để tạo ra va chạm rất, rất khó xảy ra.

new Guid() tạo ra một UUID là tất cả các số không.

Nói chung, bạn sẽ thích cái trước hơn, bởi vì đó là điểm của UUID (trừ khi bạn nhận được nó từ một nơi khác).

Có những trường hợp bạn thực sự muốn UUID hoàn toàn bằng không, nhưng trong trường hợp này Guid.Emptyhoặcdefault(Guid) rõ ràng hơn về ý định của bạn, và sẽ có ít cơ hội ai đó đọc nó mong đợi một giá trị duy nhất đã được tạo ra.

Trong tất cả các, new Guid() không hữu ích do sự thiếu rõ ràng này, nhưng không thể có loại giá trị không có hàm tạo không tham số trả về giá trị toàn bộ số không và không.

Chỉnh sửa: Trên thực tế, có thể có một hàm tạo không tham số trên một loại giá trị không đặt mọi thứ thành 0 và null, nhưng bạn không thể làm điều đó trong C # và các quy tắc về khi nào nó sẽ được gọi và khi nào sẽ chỉ là một cấu trúc hoàn toàn bằng không được tạo ra là khó hiểu, vì vậy dù sao đó cũng không phải là một ý tưởng hay.


16
Tôi sẽ thêm cái này cho vui. Để có 1% cơ hội va chạm, bạn cần tạo khoảng 2.600.000.000.000.000.000 HƯỚNG DẪN
Clinton Ward

8
@ClintonWard tùy thuộc vào thuật toán UUID nào được sử dụng, nhưng vì một số sử dụng địa chỉ MAC để tránh va chạm giữa các máy và tất cả đều sử dụng yếu tố thời gian để tránh va chạm trên cùng một máy, bạn cần tạo nhiều hơn so với toán học thông thường sẽ đề nghị. Trừ khi bạn cố tình làm hỏng thuật toán bằng cách thay đổi thời gian và làm rối loạn địa chỉ MAC, trong trường hợp đó bạn sẽ nhận được một cách khá nhanh chóng - nhưng đó là cố tình làm rối tung các đầu vào.
Jon Hanna

2
Đó là v1 Guid. MS GUID mới hơn là V4 và không sử dụng địa chỉ MAC như một phần của thế hệ GUID. Thời gian vẫn là một yếu tố mặc dù
Clinton Ward

16

[Tôi hiểu đây là một chủ đề cũ, chỉ cần thêm một số chi tiết] Hai câu trả lời của Mark và Jon Hanna tổng hợp sự khác biệt, mặc dù nó có thể quan tâm một số điều đó

Guid.NewGuid()

Cuối cùng gọi CoCreateGuid (một cuộc gọi COM đến Ole32) (tham khảo tại đây ) và công việc thực tế được thực hiện bởi UuidCreate .

Guid.Empty có nghĩa là được sử dụng để kiểm tra xem một Guid có chứa tất cả các số không. Điều này cũng có thể được thực hiện thông qua việc so sánh giá trị của Hướng dẫn được đề cập với Hướng dẫn mới ()

Vì vậy, nếu bạn cần một mã định danh duy nhất , câu trả lời là Guid.NewGuid ()


-2

Guid.NewGuid(), vì nó tạo GUID như dự định.

Guid.NewGuid()tạo một Guidđối tượng trống , khởi tạo nó bằng cách gọiCoCreateGuid và trả về đối tượng.

new Guid() chỉ tạo ra một GUID trống (tất cả các số không, tôi nghĩ vậy).

Tôi đoán họ đã phải làm cho các nhà xây dựng công khai như Guidlà một struct.


5
Điểm của việc thêm một câu trả lời không thêm bất cứ điều gì không tồn tại trong các câu trả lời đã có ở đây trong nhiều năm là gì?
Dinerdo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.