2012-02-06 33 views
12

Vì các thuộc tính thực sự chỉ là siêu dữ liệu được gắn vào các assembly, điều đó có nghĩa là các đối tượng Attribute chỉ được tạo theo yêu cầu (chẳng hạn như khi bạn gọi GetCustomAttributes)?Khi nào là đối tượng thuộc tính được tạo?

Hoặc chúng có được tạo khi tạo đối tượng không?

Hoặc, kết hợp 2 đầu tiên, được tạo khi đối tượng được tạo do quét thuộc tính của CLR?

+0

Khá liên quan: [Thuộc tính .NET: Tại sao GetCustomAttributes() tạo một cá thể thuộc tính mới mỗi lần?] (Http://stackoverflow.com/q/417275/319403). Thậm chí có thể trả lời câu hỏi của bạn, xem xét. – cHao

+0

Nó đã làm theo một cách. Câu hỏi thực sự không thực sự là vấn đề đối với tôi, nhưng ở giữa là câu trả lời. Thật tốt khi có kinh thánh từ cuốn sách CLR (thông qua @Smi). – Dann

Trả lời

8

Từ CLR thông qua C#, ấn bản thứ ba:

Nếu bạn muốn xây dựng một đối tượng thuộc tính, bạn phải gọi một trong hai GetCustomAttributes hoặc GetCustomAttribute. Mỗi khi một trong các phương thức này được gọi, nó sẽ tạo ra các cá thể mới của loại thuộc tính được chỉ định và đặt từng trường và thuộc tính của cá thể dựa trên các giá trị được chỉ định trong mã nguồn. Các phương thức này trả về các tham chiếu đến các cá thể được xây dựng đầy đủ của các lớp thuộc tính được áp dụng.

Vì vậy, có, chúng chỉ được tạo theo yêu cầu.

4

Chúng được tạo theo yêu cầu.

Ví dụ: nếu bạn thêm một số thuộc tính .NET 3.0 vào .NET 2.0 Assembly (ví dụ WCF DataContractAttribute), bạn vẫn có thể sử dụng .NET 2.0 Assembly trên máy không có .NET. 3.0 được cài đặt, miễn là bạn không có bất kỳ mã nào cố gắng truy cập các thuộc tính.

2

Nó không phải là khá sạch sẽ, thuộc tính cũng ảnh hưởng đến thế hệ mã. Một số thuộc tính được giải thích bởi trình biên dịch, ví dụ [DllImport]. Một số được phát hiện bởi jitter, [MethodImpl] chẳng hạn. Điều này là vô hạn mở rộng đến các công cụ và các lớp khác trong khuôn khổ được viết để tận dụng lợi thế của các thuộc tính.

Nhưng những công cụ này chỉ làm những gì bạn cần làm nếu bạn muốn tìm thuộc tính của riêng bạn, hãy gọi GetCustomAttributes() là bắt buộc. Loại mã đó không bao giờ được kết hợp với một thể hiện của đối tượng, các thuộc tính áp dụng cho các kiểu.

+0

Vì vậy, những thuộc tính thuộc về hệ thống ("DllImport") có được giữ nguyên như siêu dữ liệu và được phân tích cú pháp theo cách đó, thay vì một đối tượng được tạo và sau đó được sử dụng không? – Dann

+1

Những công cụ thực sự * làm * với thuộc tính là tất cả các nơi. –

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