Kolekcje w Visual Basic są potrzebne do przechowywania grupy obiektów lub wartości w zmiennej. Standardowe kolekcje, takie jak Collection, ArrayList i uogólnione List(Of T), oferują różne metody dostępu, dodawania i usuwania elementów oraz różnią się bezpieczeństwem typów, wydajnością i możliwościami.
W klasycznym VB6 istniała tylko typizowana kolekcja Collection. W .NET pojawiły się mocniejsze struktury, w tym ArrayList (stary uniwersalny typ bez ścisłej typizacji) oraz nowoczesne kolekcje uogólnione (Generic Collections) takie jak List(Of T), które pojawiły się w .NET 2.0.
Największa trudność polega na wyborze odpowiedniej kolekcji do zadań projektu. Kolekcje bez ścisłej typizacji (ArrayList, Collection) mogą prowadzić do błędów w czasie wykonywania lub problemów z wydajnością. Kolekcje uogólnione wymagają parametryzacji, ale oferują maksymalne bezpieczeństwo i wygodę pracy z typami.
Używaj starej kolekcji Collection tylko do interakcji z przestarzałym kodem, a dla nowych projektów preferuj List(Of T). Kolekcja ArrayList przyda się tylko wtedy, gdy nie ma informacji o typie elementów, ale w takim przypadku lepiej użyć List(Of Object) lub innych kolekcji z Generic.
Przykład kodu:
' Kolekcja Dim coll As New Collection() coll.Add("Hello") coll.Add(123) ' ArrayList Dim arr As New ArrayList() arr.Add("World") arr.Add(456) ' List(Of T) Dim list As New List(Of Integer)() list.Add(789) list.Add(101112)
Kluczowe cechy:
Czym się różni Collection od tablicy w Visual Basic?
Tablica ma ustaloną wielkość przy inicjalizacji, przechowuje elementy jednego typu i wspiera szybki dostęp przez indeks. Kolekcja dynamicznie się zwiększa, może przechowywać obiekty różnych typów i wspiera dostęp przez klucz (ale nie indeksowalny w VB6).
Co się stanie, jeśli spróbujesz dodać obiekt o tym samym kluczu do Collection?
Próba dodania elementu o już istniejącym kluczu spowoduje błąd w czasie wykonywania „Key already exists in collection”.
Dim c As New Collection() c.Add("one", "a") c.Add("two", "a") ' Błąd
Czy można przekonwertować ArrayList na typ List(Of T) standardowym sposobem?
Nie, zwykła konwersja jest niemożliwa — trzeba ręcznie stworzyć nowy List(Of T) i skopiować odpowiednie elementy, w przeciwnym razie wystąpią błędy w czasie wykonywania z powodu niestrukturalnej typizacji ArrayList.
W projekcie do przechowywania klientów używana jest ArrayList, do której przypadkowo dodano ciąg zamiast obiektu Client. Na etapie przetwarzania pojawia się błąd rzutowania typów, który jest trudny do zdiagnozowania.
Zalety:
Wady:
Wykorzystywany jest ściśle typizowany List(Of Client), cały kod jest kompilowany z opcją Strict On. Błędy są wykrywane na etapie kompilacji, struktura jest łatwo rozszerzalna o nowe metody LINQ.
Zalety:
Wady: