Vì mọi thứ được kế thừa từ đối tượng, sự khác nhau giữa List<T>
và List<object>
là gì? Ưu điểm? Nhược điểm?Sự khác biệt giữa Danh sách <T> và Danh sách <object>?
Trả lời
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).
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.
Cảm ơn bạn đã sửa dấu ngoặc, John. Tôi chỉ định làm điều đó. –
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
Đ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. –
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.
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
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
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.
Ví dụ hay. Giúp tôi hiểu rõ hơn. – Xaisoft
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.
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>();
Danh sách
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
- 1. Sự khác biệt giữa Danh sách <T> và LinkedList <T>
- 2. Whats sự khác biệt giữa danh sách [-1:] [0] và danh sách [len (danh sách) -1]?
- 3. Sự khác nhau giữa Danh sách <string> và IEnumerable <String> là gì?
- 4. Sự khác nhau giữa HashSet <T> và Danh sách <T> là gì?
- 5. sự khác biệt giữa danh sách <> và từ điển <> trong C# là gì
- 6. So sánh sự khác biệt giữa hai danh sách <string>
- 7. Sự khác biệt thực tế giữa Danh sách và IEnumerable
- 8. Whats sự khác biệt giữa ba cách tạo Danh sách mới <string> trong C#?
- 9. sao chép danh sách python: có sự khác biệt giữa [cũ] và danh sách (cũ) không?
- 10. Danh sách <?> so với Danh sách <? extends Object>
- 11. Danh sách <Object> vs Danh sách <dynamic>
- 12. Bash - Sự khác biệt giữa hai danh sách
- 13. Có sự khác biệt giữa Count() (phần mở rộng LINQ) và Danh sách <T> .Count
- 14. OOC: Sự khác biệt giữa ToList() và truyền tới Danh sách <T> trong .NET là gì?
- 15. C# Danh sách chuyển đổi <int> thành Danh sách <double>
- 16. Nhập danh sách được phổ biến <BaseClass> vào Danh sách <ChildClass>
- 17. Sự khác nhau giữa Danh sách và mảng
- 18. Cách truyền Danh sách <object> vào Danh sách <SomethingElse>
- 19. Sự khác nhau giữa Danh sách và ArrayList là gì?
- 20. Danh sách chuyển đổi <Integer> thành Danh sách <String>
- 21. Cách thêm Danh sách <> vào Danh sách <> trong asp.net
- 22. C# Đúc Danh sách <ushort> vào danh sách <short>
- 23. C# vấn đề sai: Gán Danh sách <Derived> như Danh sách <Base>
- 24. Đúc Danh sách <x> vào danh sách <y>
- 25. Danh sách Hiệu suất SqlDataReader <string[]> hoặc Danh sách <object[]>
- 26. Chuyển đổi Danh sách <MyObject> thành Từ điển <obj.string, Danh sách <obj.ID>>
- 27. Danh sách <IJob> .AddRange (Danh sách <Job>) Không hoạt động
- 28. chuyển đổi danh sách <int> thành danh sách <long>
- 29. Chuyển đổi Danh sách <Enum> vào danh sách <string>
- 30. Danh sách LINQ <string> union
Câu trả lời hay. Sẽ giữ boxing/unboxing trong tâm trí – Xaisoft