A generikus típusokat a C# 2.0 tartalmazza először. Ezek révén nincs szükség adatkonverzióra gyűjtemények használata során. A típus biztonság javul, kevesebb bedobozolásra lesz szükség, és egyszerűbb lesz az általános osztályok és metódusok létrehozása. A .NET-keretrendszer 2.0-ás verziója a System.Collections.Generic névtere sok gyűjteményosztályt és interfészt tartalmaz generikus verzióban.
A típusparamétert relációs jelek közé kell helyeznünk, amikor a változót deklaráljuk.
A típus paraméter meghatározza, hogy az objektum milyen típust fogad el.
A metódusok ezután a megadott objektumtípust fogják várni paraméterként. Fontos
tudni, hogy a típusparaméter helyettesítése a megadott típussal nem csupán szöveghelyettesítési
algoritmus. A fordítóprogram teljes szemantikai behelyettesítést végez, amivel bármilyen
érvényes típust megadhatunk a típusparaméternek.
Egy generikus osztály több típusparaméterrel is rendelkezhet. A generikus System.Collections.Generic.Dictionary osztályt például név érték párokkal lehet példányosítani, ezért két típusparamétert fogad el. Ennek megfelelően az osztály definíció a következő alakú:
Példa a Dictionary osztály példányosítására:
Néha szeretnénk tudni, hogy a generikus osztály által használt típusparaméter olyan típust jelöl, amely megfelel bizonyos kritériumoknak, pontosabban rendelkezik néhány szükséges metódussal. Ezt megszorítással biztosíthatjuk. Megszorítással a generikus osztály típusparamétereit olyan típusokra korlátozzuk, amelyek rendelkeznek bizonyos interfész halmazzal és így az interfészek által definiált metódusokat tartalmazzák. Ha például a generikus típusunkban csak ISerializable típusparamétert szeretnénk elfogadni a generikus típusunk definíciója a következő alakú lesz:
Generikus típus |
Leírás |
---|---|
Dictionary<TKey, TValue> |
Név/érték párokat tartalmazó, név szerint indexelt lista. |
Dictionary<TKey, TValue>.KeyCollection |
A nevek listája. |
Dictionary<TKey, TValue>.ValueCollection |
Az értékek listája. |
HashSet<T> |
Értékhalmaz. |
LinkedList<T> |
Láncoltlista. |
LinkedListNode<T> |
Láncoltlista egy eleme. |
List<T> |
Lista. |
Queue<T> |
Sor. |
SortedDictionary<TKey, TValue> |
Rendezett név/érték párokat tartalmazó név szerint indexelt lista. |
SortedDictionary<TKey, TValue>.KeyCollection |
A nevek listája. |
SortedDictionary<TKey, TValue>.ValueCollection |
Az értékek listája. |
SortedList<TKey, TValue> |
Rendezett lista, név/érték párokkal. |
SortedSet<T> |
Halmaz, amelynek elemeire rendezett tárolás van megvalósítva. |
Stack<T> |
Verem. |
A típusparamétereket használó generikus típus fogalma eltér az általánosított osztály fogalmától. Ez utóbbi olyan paramétereket fogad el, amelyek más típusra konvertálhatóak. A System.Collections névtér általánosított osztályainak egyetlen megvalósítása van, amely System.Object típust fogadnak el és ezzel is térnek vissza. Adatkonverzióval elérhető különböző típusú adatok tárolása ezekben, azonban ettől még egy osztálymegvalósítást használunk ezért ezek nem sablon típusok. A sablont használó osztályokat ezekkel szemben a fordítóprogram olyan típus használatára fogja megvalósítani, amelyet a típusparaméterben megadtunk.
A System.Collections névtér segítségével lehetőségünk nyílik a legtöbb közismert adattípus használata. Itt található pl.az egyszerű verem, sor, vagy akár a bonyolultabb rendezett lista. Az alábbi adattípusok vannak közös propertije ill. metódusai (mivel ugyanazokból az interfészekből származnak) pl.:
Egyszerű firt-in-last-out adattípus. Műveletei az ismert Push, Pop. Viszont Top helyett a Peek metódus tér vissza a verem tetején lévő elemmel.
Egyszerű firt-in-first-out adattípus. Az Enqueue metódussal rakhatunk a sorba egy elemet, a Dequeue metódussal pedig kivehetjük. A Peek metódus tér vissza a sor elején található elemmel. A TrimToSize metódussal, pedig méretre szabhatjuk a sorunkat, csökkentve a jelenlegi elemek számára.
Egy tömb típus, aminek a méretét dinamikusan változtathatjuk. Mivel az IList interfészt is implementálja úgy is tekinthetünk rá, mint egy listára. Az Add ill. Insert-tel beszúrhatunk egy elemet a tömb végére vagy valamelyik helyére. A Remove-val kiveszük az adott elem első előfordulási helyéről, a RemoveAt-tel pedig bármelyik indexű helyről. A Sort metódussal egy QuickSort rendezést végezhetünk el a tömbön.
A BitArray-jel bit tömböt definiálhatunk, amely bool ként van ábrázolva, tehát true,
ha 1, false, ha
A HashTable egy hash táblát valósít meg, ami egy hash kulcsból (ez alapján rendezett) és az értékből.
A SortedList egy rendezett lista, kulcsokat és értékeket tartalmaz, amelyhez a kulcsokon keresztül vagy indexelve férhetünk hozzá.
Az IList egy nem generikus, objektumokból álló gyűjtemény (Collection), az egyes elemeit indexeléssel érhetjük el. Létezik generikus változata is, mégpedig a System.Collections.Generic.IList<>. A példányosítása a System.Collection.ArrayList osztály konstruktorával történik:
System.Collection.IList myIList = new ArrayList();
Az elemszámát az int típusú Count adattag adja meg, amit a System.Collection.ICollection-től örököl:
int lengthIList = myIList.Count;
Mivel bármilyen típusú elemet képes tárolni, ezért mondhatnám, hogy univerzális megoldás, de mégsem teszem, hisz vannak olyan esetek, amikor nem megfelelő. Pl. ha nagyon sok (többszázezer) elemmel dolgozunk és esetleg több ilyen adatszerkezetet is szeretnénk használni, akkor egy általunk megírt egyszerű tömböket használó adatszerkezet sokkal hatékonyabb lehet. Az sem kizárt, hogy memóriatakarékosabbat írunk.
Az IList fontosabb metódusai: