2011-06-21 55 views
6

Tôi đã suy nghĩ về điều này. các lớp học rõ ràng được thông qua xung quanh bởi ptr. Tôi nghi ngờ cấu trúc được thông qua xung quanh bằng cách sao chép nó, nhưng tôi không biết chắc chắn. (nó có vẻ như một sự lãng phí cho một mảng int để có mọi phần tử một ptr. và đi qua ptrs cho ints)Làm thế nào để generics thực hiện cấu trúc?

Nhưng suy nghĩ về nó, List<MyStruct> không thể biết kích thước của cấu trúc của tôi. Điều gì sẽ xảy ra khi tôi làm điều này? Có nhiều bản sao của "List`1" và mỗi khi tôi sử dụng nó với một kích thước lưu trữ nó không có nó tạo ra một thực hiện mới? (điều chỉnh cho các offset mới của T và như vậy).

Điều đó có thể có ý nghĩa vì nguồn sẽ nằm trong CIL bên trong tệp DLL. Nhưng tôi hoàn toàn đoán, làm thế nào nó được thực hiện? Có lẽ một tài liệu tham khảo hoặc trang # cho các tiêu chuẩn ECMA?

+0

Tôi biết rất ít về cách C# thực hiện generics. Nhưng để tham khảo, đó chính xác là cách các mẫu C++ hoạt động (theo lý thuyết, việc thực hiện riêng biệt 'Danh sách' sẽ được khởi tạo cho từng loại). –

+0

@Oli: Vâng, tôi cũng biết nó không biên dịch phương pháp trừ khi bạn sử dụng nó và bạn cần mẫu trong tiêu đề. C# không có tiêu đề nhưng generics vẫn hoạt động sau khi chúng được biên dịch thành một dll –

+1

@Oli: Tức là, nó sẽ có các triển khai riêng biệt cho từng loại giá trị và một triển khai được chia sẻ cho các loại tham chiếu. –

Trả lời

9

Generics sử dụng khái niệm về các kiểu generic mở và đóng: Một định nghĩa lớp chung parametrized (tức là List<T>) là một kiểu generic mở mà thời gian chạy tạo ra một kiểu generic đóng cho mỗi cách sử dụng khác nhau trong mã của bạn. loại khác nhau được tạo cho List<int> và cho List<MyStruct> - đối với mỗi loại chung đóng, kích thước và loại T được biết đến trong thời gian chạy.

Làm rõ từ MSDN:

Khi một kiểu generic hoặc phương pháp là biên dịch vào Microsoft trung ngôn ngữ (MSIL), nó có chứa siêu dữ liệu xác định nó là có loại tham số. Cách MSIL cho loại chung loại được sử dụng khác nhau dựa trên việc thông số loại được cung cấp có phải là giá trị loại hoặc loại tham chiếu hay không.

Khi một kiểu generic là lần đầu tiên xây dựng với một kiểu giá trị như một tham số , bộ thực thi sẽ tạo ra một chuyên ngành loại generic với tham số cung cấp hoặc thông số thay trong vị trí thích hợp trong MSIL. Các kiểu chung chuyên biệt được tạo một lần cho mỗi loại giá trị duy nhất được sử dụng làm một tham số.

Generics hoạt động hơi khác với các loại tham chiếu . Lần đầu tiên loại hình chung loại được xây dựng với bất kỳ loại tham chiếu nào, thời gian chạy tạo ra một loại chung loại với đối tượng tham chiếu được thay thế cho các tham số trong MSIL. Sau đó, cứ mỗi thời gian mà loại được xây dựng là được khởi tạo với loại tham chiếu là thông số của nó, bất kể loại đó là thời gian chạy lại phiên bản chuyên biệt được tạo trước đó của loại chung. Điều này có thể là vì tất cả các tham chiếu đều có cùng kích thước .

2

CLR biên dịch 1 phiên bản của lớp chung và sử dụng nó cho tất cả các loại tham chiếu. Nó cũng biên dịch 1 phiên bản cho mỗi loại giá trị sử dụng để tối ưu hóa hiệu suất.

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