2011-08-26 51 views

Trả lời

11

Nếu bạn chèn int vào List<object>, nó sẽ được đóng hộp. Nếu bạn chèn nó vào List<int>, nó sẽ không được đóng hộp (điều này đúng cho bất kỳ loại giá trị nào, thay thế int theo tên của loại). Tương tự để truy xuất các giá trị từ List<object>, việc hủy hộp sẽ xảy ra, nhưng không xảy ra cho List<int>.

List<T> được nhập mạnh, List<object> không phải là (vì vậy bạn mất an toàn thời gian biên dịch và có thể đạt thời gian chạy lên).

+0

Câu trả lời hay. Sẽ giữ boxing/unboxing trong tâm trí – Xaisoft

4

Nếu bạn sử dụng List<object> bạn sẽ không có bất kỳ mục nhập nào và sẽ phải truyền mọi thứ. Thêm vào đó, đó là nguy hiểm bởi vì bạn có thể đặt bất cứ điều gì vào danh sách và không biết chính xác những gì bạn đang nhận lại cho bất kỳ mục nào.

+0

Cảm ơn bạn đã sửa dấu ngoặc, John. Tôi chỉ định làm điều đó. –

+0

Bằng cách "... đánh máy ...", bạn có nghĩa là tôi sẽ không thể truy cập các thuộc tính hoặc phương pháp cho đến khi tôi thực hiện truyền. – Xaisoft

+0

Điều đó cộng với hỗ trợ thời gian biên dịch mà bạn đang thêm đúng loại mục vào bộ sưu tập. Tuy nhiên, nhược điểm rõ ràng nhất là không thể tương tác với đối tượng mà không cần phải đúc. –

9

nếu bạn có List<T> bạn chắc chắn rằng khi đối tượng được khởi tạo, danh sách chỉ chứa các trường hợp của loại T, trong một List<object> bạn có thể đặt bất kỳ thứ gì bên trong.

Generics là cách hay để viết mã có thể sử dụng lại có loại mạnh vào thời gian biên dịch.

+0

Vì vậy, nếu Danh sách có thể chứa các loại khác nhau, có tốt hơn khi sử dụng đối tượng không? – Xaisoft

+1

Câu trả lời hay bằng cách này. Tôi không nghĩ về an toàn kiểu với Danh sách như trái ngược với Danh sách Xaisoft

2

Danh sách có loại chung làm đối số mẫu. Vì vậy, bạn sẽ thực sự có một danh sách những chiếc xe nếu bạn làm:

List<car> list = new List<car>(); 

Trong đó:

List<object> objlist = new List<object>(); 

thể giữ tham chiếu đến bất cứ điều gì. Vấn đề là, các tài liệu tham khảo này được downcasted cho các đối tượng và bạn không thể sử dụng các thành viên và chức năng của họ cho đến khi bạn recast chúng vào đúng đối tượng. Ví dụ, nếu bạn giữ xe trong objlist, bạn phải làm:

((car)objlist[0]).GetMaker(); 

Để gọi những chiếc xe wehreas chức năng GetMaker với danh sách mà bạn có thể làm:

list[0].GetMaker(); 

này giả định bạn có ít nhất một chiếc xe/obj trong danh sách.

+0

Ví dụ hay. Giúp tôi hiểu rõ hơn. – Xaisoft

0

Câu hỏi này hơi khó hiểu nhưng tôi nghĩ rằng jsmarble đã đánh vào một trong những điểm chính ở chỗ bạn sẽ phải truyền mọi thứ tới loại bạn yêu cầu. Không hiệu quả, đặc biệt là với các loại giá trị mà List<T> sẽ xử lý mà không cần phải bỏ hộp và bỏ hộp giá trị.

Bạn cũng hy sinh loại an toàn có khả năng gây ra lỗi thời gian chạy.

1

Bạn có thể xem T là một ràng buộc kiểu trên Danh sách. Vì vậy, nếu bạn nói

class Vehicle {} 
class Car : Vehicle {} 
class Boat : Vehicle {} 
class SpeedBoat : Boat {} 
List<Boat> listOfBoats 

Danh sách này chỉ có thể chứa loại Thuyền và hậu duệ của nó chứ không phải bất kỳ phương tiện nào khác. Nếu bạn đã đặt nó thành đối tượng thì Danh sách về cơ bản có thể chứa bất kỳ loại tham chiếu nào.

Lưu ý rằng nếu bạn muốn, ví dụ:tất cả SpeedBoats từ bộ sưu tập đó, bạn có thể sử dụng phương pháp mở rộng tốt đẹp OfType:

//Returns IEnumerable<SpeedBoat>, casting is done for you 
var speedBoats = listOfBoats.OfType<SpeedBoat>(); 
+0

Danh sách sẽ cho phép tôi sử dụng Xe hơi và Thuyền, đúng không? và kể từ khi SpeedBoat kế thừa từ Thuyền kế thừa từ Xe, tôi có thể thực hiện Danh sách hoặc tôi có phải sử dụng phần mở rộng OfType không? – Xaisoft

+0

Có một danh sách (xe) có thể chứa một chiếc xe hơi, thuyền, tàu cao tốc, bất kỳ hậu duệ của xe. Danh sách sẽ KHÔNG cho phép, ví dụ: .Thêm (Thuyền mới()). Nếu bạn muốn một Danh sách ra khỏi Danh sách được điền dân số thì bạn có thể nói Danh sách sbs = vehicles.OfType () – edvaldig

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