Ponieważ wszystko dziedziczy z obiektu, jaka jest różnica między List<T>
i List<object>
? Zalety? Niedogodności?Różnica między listą <T> a listą <object>?
Odpowiedz
Po wstawieniu int
do List<object>
, będzie to pudełko. Jeśli wstawisz go do List<int>
, nie będzie on oznaczony ramką (dotyczy wszystkich typów wartości, zastępując int
nazwą typu). Podobnie w przypadku pobierania wartości z List<object>
, nastąpi rozpakowanie, ale nie dla List<int>
.
List<T>
jest silnie wpisany na klawiaturze, List<object>
nie jest (więc tracisz czas na kompilację i możesz uderzać w środowiska uruchomieniowe).
Jeśli użyjesz List<object>
, nie będziesz mieć żadnego przedmiotu do pisania i będziesz musiał rzucić wszystko. Dodatkowo, jest to niebezpieczne, ponieważ możesz umieścić coś na liście i nie wiesz dokładnie, co otrzymujesz z danego przedmiotu.
Dzięki za naprawienie wsporników, John. Właśnie chciałem to zrobić. –
Przez "... wpisywanie pozycji ..." masz na myśli, że nie będę mógł uzyskać dostępu do właściwości lub metod, dopóki nie wykonam rzutowania. – Xaisoft
To dodatkowe wsparcie dla czasu kompilacji, do którego dodajesz odpowiedni typ elementu do kolekcji. Najbardziej oczywistą wadą nie jest jednak możliwość interakcji z obiektem bez rzutowania, tak. –
jeśli masz List<T>
masz pewność, że po utworzeniu obiektu lista zawiera tylko wystąpienia typu T, w List<object>
możesz umieścić wszystko w środku.
Generics są dobrym sposobem na napisanie kodu wielokrotnego użytku o silnych typach w czasie kompilacji.
Tak więc, jeśli lista może zawierać różne typy, czy lepiej jest użyć obiektu? – Xaisoft
Dobra odpowiedź przy okazji. Nie myślałem o bezpieczeństwie typu z listą
Lista przyjmuje typowy typ jako argument szablonu. Tak, będzie rzeczywiście mieć listę samochodów, jeśli nie:
List<car> list = new List<car>();
następuje:
List<object> objlist = new List<object>();
Może pomieścić odniesień do niczego. Problem polega na tym, że te odniesienia są downcasted do obiektów i nie możesz używać ich członków i funkcji, dopóki nie przekształcisz ich w odpowiedni obiekt. Na przykład, jeśli odbywają się samochody w objlist, trzeba zrobić:
((car)objlist[0]).GetMaker();
Aby połączyć samochody GetMaker wehreas funkcji z listy można zrobić:
list[0].GetMaker();
Zakłada się, że co najmniej jeden samochód/obiekt na liście.
Dobry przykład. Pomógł mi lepiej zrozumieć. – Xaisoft
Pytanie jest trochę mylące, ale myślę, że jsmarble uderzyło w jeden z głównych punktów, w którym będziesz musiał rzucić wszystko, czego potrzebujesz. Jest nieefektywny, szczególnie w przypadku typów wartości, które będą obsługiwać List<T>
bez konieczności otwierania i rozpakowywania wartości.
Poświęcasz również bezpieczeństwo typu, które potencjalnie może spowodować błędy w czasie wykonywania.
Możesz uznać T jako ograniczenie typu na liście. Jeśli więc powiesz, że
class Vehicle {}
class Car : Vehicle {}
class Boat : Vehicle {}
class SpeedBoat : Boat {}
List<Boat> listOfBoats
Lista może zawierać tylko typ łodzi i jej potomków, ale nie innych pojazdów. Jeśli ustawiłeś to na obiekt, lista mogłaby w zasadzie zawierać dowolny typ odniesienia.
Pamiętaj jednak, że jeśli chcesz np.wszystkie SpeedBoats z tej kolekcji możesz użyć ładnej metody rozszerzenia OfType:
//Returns IEnumerable<SpeedBoat>, casting is done for you
var speedBoats = listOfBoats.OfType<SpeedBoat>();
Lista
Tak, lista (pojazdów) może zawierać samochód, łódź, łódź motorową, dowolnych potomków pojazdu. Lista
- 1. Różnica między bytearray a listą
- 2. Jaka jest różnica między listą <string> a IEnumerable <String>?
- 3. Czy istnieje różnica między listą a krotką?
- 4. Jaka jest różnica między Listą a ArrayList?
- 5. Jest listą <BlockingCollection <T>> Gwint bezpieczny?
- 6. Jaka jest różnica między listą [-1:] [0] a listą [len (lista) -1]?
- 7. Różnica między używaną listą a tyłem w makrach
- 8. Jaka jest różnica między "<>" a "! ="?
- 9. Java Typ ogólny: różnica między listą <? rozciąga numer> i List <T rozciąga Number>
- 10. Jaka jest różnica między "(a b c) a (listą" a "b" c)?
- 11. Ukrywanie kolumn w DataGridView z listą <> jako DataSource?
- 12. Problem z listą edycji <double[]> w C#
- 13. Jaka jest różnica między << i + =?
- 14. Wiosenny start, jak używać @Valid z listą <T>
- 15. JSON.net - pole jest ciągiem lub Listą <string>
- 16. Jak utworzyć listę z listą <enum>?
- 17. Przeciążanie operatora C# z listą <T>
- 18. Jaka jest różnica między "zakresem (0,2)" i "listą (zakres (0,2))"?
- 19. Jaka jest różnica między <%: a <% = i <% # w aspxie?
- 20. Różnica między std :: function <> a standardowym wskaźnikiem funkcji?
- 21. Jaka jest różnica między mysqlimport a mysql <dbfile.sql
- 22. Jaka jest różnica między Vec <struct> a & [struct]?
- 23. Jaka jest różnica między plusem a dodaniem w pythonie do manipulacji listą?
- 24. W Lisp (Clojure, Emacs Lisp), jaka jest różnica między listą a ofertą?
- 25. Różnica między <string> i <string.h>?
- 26. Jaka jest różnica między tagami otwierającymi <% # i <% = otwierającymi?
- 27. W ASP.Net, jaka jest różnica między <% = i <% #
- 28. Różnica między <% ... %> i <%= .. %> w szynach 3
- 29. Jaka jest różnica między <% # i <% = w ASP.NET MVC?
- 30. Jaka jest różnica między <%# %> i <%= %>?
Świetna odpowiedź. Będziemy pamiętać o boksowaniu/rozpakowywaniu – Xaisoft