2011-12-29 27 views
8

thể trùng lặp:
Are automatically generated GUIDs for types in .NET consistent?Loại.GUID có nhận dạng duy nhất từng loại trên các bộ sưu tập không?

Tôi muốn sử dụng Type như một cuốn từ điển quan trọng, nhưng tôi muốn sử dụng một trong hai loại tên đầy đủ hoặc Type.GUID. Mức độ tin cậy và chính xác là Type.GUID cho tác vụ này như thế nào?

Ayende Rahien viết:

Bạn có thể dựa vào System.Type.GUID được ổn định?

Bởi ổn định, tôi có nghĩa là nó sẽ tạo ra cùng một giá trị cho cùng một loại trên các bộ sưu tập. bằng chứng thực nghiệm cho thấy rằng đây là trường hợp, với các yếu tố sau xác định Guid của một loại:

  • tên Loại (bao gồm cả không gian tên)
  • tên hội
  • hội công chính

Reflectoring vào hệ thống, nó chỉ ra rằng System.Type.GUID là cuối cùng dịch sang một cuộc gọi đến System.RuntimeType.GetGUID, đây là một trong những phương pháp InternallCall đáng sợ được thực hiện trực tiếp trong bản thân thời gian chạy.

Tôi tự hỏi ...

Trả lời

4

Từ tài liệu tại http://msdn.microsoft.com/en-us/library/system.type.guid.aspx.

Mục đích của Type.GUID là lấy giá trị được liên kết với lớp học bằng cách sử dụng [Guid("...")]. Tuy nhiên, nó cũng trả về một guid khi thuộc tính này không được liên kết. Vấn đề là nơi nó được điều này. Một thử nghiệm nhỏ cho thấy rằng các guid là ổn định. Tôi đã kiểm tra hướng dẫn của một lớp và xác minh rằng nó đã thay đổi khi tôi đổi tên lớp học. Khi tôi đổi tên lớp học trở lại, tôi lại nhận được bản gốc. Tuy nhiên, vì các guids này xuất hiện từ không khí mỏng nên chúng không được tin cậy để ổn định theo thời gian, bản phát hành, phiên bản khung, v.v.

1

Tôi nghĩ rằng nó không tạo ra vấn đề sử dụng Type.GUID như một chìa khóa để từ điển của bạn. nếu Guid không đáng tin cậy hơn hầu hết thành phần COM sẽ không hoạt động.

+0

Bạn có thể trỏ đến nguồn xác nhận điều này không? – Oded

3

Không sử dụng.

typeof(byte).GUID 
00000000-0000-0000-0000-000000000000 

typeof(int).GUID 
00000000-0000-0000-0000-000000000000 

typeof(short).GUID 
00000000-0000-0000-0000-000000000000 

Thử nghiệm trên ideone.com, họ chạy Mono 2.8

EDIT: sau using System.Reflection trên nhiều cụm (lớn) Tôi không thể tìm thấy một vụ va chạm giữa hai GUID. Vì vậy, có vẻ như vấn đề 0-GUID là Mono cụ thể.

+0

Trong điều kiện nào? Phiên bản CLR nào? Trong trường hợp của tôi (.NET 4 sử dụng LINQpad) tôi nhận được kết quả khác 0, nhưng chạy chương trình khác nhau. –

+0

Tôi cũng nhận được số không 0 (.Net 4, ứng dụng bảng điều khiển đơn giản). – ken2k

+0

Tại sao tôi nhận được GUID khác nhau? Làm thế nào bạn có được tất cả các zero? –

2

Type.FullName hoặc Type.AssemblyQualifiedName phù hợp với nhu cầu của bạn. Ngoài ra nó sẽ đơn giản hóa gỡ lỗi rất nhiều so với GUIDs (tên có ý nghĩa của loại so với GUID không rõ).

Một điểm khác là thuộc tính GUID dường như không được tài liệu tốt, vì vậy tôi sẽ không dựa vào nó.

EDIT: bạn cũng có thể sử dụng chính cá thể Type làm khóa.

1

Bạn nên tạo từ điển động, tra cứu GUID mỗi lần hoặc bạn nên đặt GUID tĩnh, với lớp GuidAttribute. Bạn không nên dựa vào hành vi không được bảo đảm.

Các vấn đề liên quan