List<T>
sở hữu một mảng T[]
. Nó sử dụng chiến lược tăng trưởng theo hàm mũ cho mảng này, do đó danh sách có các thành phần n
thường có mảng sao lưu có kích thước lớn hơn n
. Ngoài ra các mảng nhỏ hơn cần phải được thu gom rác thải, có thể gây phiền nhiễu nếu đủ lớn để có trên LoH.
Nhưng bạn có thể tránh điều này bằng cách chỉ định dung lượng theo cách thủ công, ví dụ như tham số hàm tạo. Sau đó, một mảng duy nhất với dung lượng mong muốn sẽ được cấp phát, vì vậy bạn tránh cả hai vấn đề trên.
Ngoài ra List<T>
có một chi phí nhỏ O (1) cho chính đối tượng danh sách.
Nhưng không có chi phí cho mỗi phần tử khi sử dụng Generics. Thời gian chạy tạo ra một phiên bản chuyên biệt cho mỗi loại giá trị bạn vượt qua. Không có quyền anh hùng nào xảy ra.
Nhưng bạn không thể sử dụng chuyên môn mẫu kiểu C++, nơi bạn thực hiện quá tải việc thực hiện một cách hiệu quả đối với các thông số loại nhất định. Tất cả các instantiations chung đều có cùng mã C#.
tức là không có mã IL chuyên biệt, nhưng mỗi loại giá trị sẽ được triển khai mã máy chuyên biệt dựa trên cùng một mã nguồn.
Bạn muốn nói rằng Danh sách <> là một mảng khi nói đến triển khai? –
@Daniel: Vâng, một mảng có thể phát triển. – sepp2k
@ DanielMošmondor: [Có] (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx): * Lớp List (Of T) là tương đương chung của lớp ArrayList. Nó thực hiện giao diện chung IList (Of T) sử dụng một mảng có kích thước được tăng động theo yêu cầu. * – Jon