Generics Krizsán Zoltán
Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben ez a template (sablon). Metódus, osztály Metódus, osztály Változóinak Változóinak Adattagjainak Adattagjainak típusait nem rögzítjük. Általános megoldások Általános megoldások
Jellemzők Növeli a kód újrahasznosíthatóságot Növeli a kód újrahasznosíthatóságot Egyszerűsíti a kódot, gyorsabb működés (nem kell a sok cast) Egyszerűsíti a kódot, gyorsabb működés (nem kell a sok cast) Általában gyűjtemények készítéséhez, segítéséhez használjuk. Általában gyűjtemények készítéséhez, segítéséhez használjuk. Vannak beépített generic-ek (System.Collections.Generic): Vannak beépített generic-ek (System.Collections.Generic):System.Collections.Generic List, Queue, Stack, LinkedList List, Queue, Stack, LinkedList
Beépített generics-ek ArrayList List<> Queue Queue<> Stack Stack<> Hashtable Dictionary<> SortedList SortedList<> ListDictionary Dictionary<> HybridDictionary Dictionary<> OrderedDictionary Dictionary<> SortedDictionary SortedDictionary<> NameValueCollection Dictionary<> DictionaryEntry KeyValuePair<>
Alkalmazhatóság Interfészhez, Interfészhez, Osztályhoz, Osztályhoz, Delegátumhoz, Delegátumhoz, Metódushoz, Metódushoz, Eseményhez Eseményhez
Eddigi megoldás Object alapú megoldás Object alapú megoldás Hozzáadás egyszerű, DE a kiolvasáskor cast. Következmény: Hozzáadás egyszerű, DE a kiolvasáskor cast. Következmény: Lassú kód (+ művelet a cast) Lassú kód (+ művelet a cast) Hibalehetőség: Hibalehetőség: System.Collections.ArrayList list = new System.Collections.ArrayList(); list.Add(3); list.Add("It is raining in Redmond."); int t = 0; foreach (int x in list) { t += x; // kivétel a 2. pozicióban, mert az nem integer t += x; // kivétel a 2. pozicióban, mert az nem integer}
Generics megoldás //Hozzunk létre egy konkrét típus osztályt List list1 = new List (); // nincs cast, nincs boxolás list1.Add(3); // A következő sor fordítási hibát okozna // list1.Add("It is raining in Redmond."); // a következő sorok biztosan, hibamentesen lefutnak int t = 0; foreach (int x in list) { t += x; t += x;}
Használat, működés Forráskódban: Hozzuk létre a generics típust. Hozzuk létre a generics típust. Hozzunk létre konkrét példányt Hozzunk létre konkrét példányt Futásidőben az RTL - amikor először szükség van arra a konkrét típusú osztályra – létrehozza.
Generics osztály definiálása Class osztaly {…} alakú Class osztaly {…} alakú Ezek után az osztályon belül a típusparaméterben szereplő típus azonosítók használhatók, mint típusok. Ezek után az osztályon belül a típusparaméterben szereplő típus azonosítók használhatók, mint típusok.
Típus paraméter alakú alakú Az osztályon belül használhatóak a típusok Az osztályon belül használhatóak a típusok Szabályok: Szabályok: Nem lehet sem interfész, sem ősosztály Nem lehet sem interfész, sem ősosztály Nem lehet attribútum típus Nem lehet attribútum típus
Konkretizálás Meg kell adni egy konkrét típust a példányosításnál. Meg kell adni egy konkrét típust a példányosításnál. Osztaly Objketum = new Osztaly (); Osztaly Objketum = new Osztaly (); MIND 2 OLDALON KELL A MIND 2 OLDALON KELL A
Példakód - deklaráció public class GenericList { private class Node { Node(T t) { next = null; data = t; } public Node Next { get { return next; } set { next = value; } } private T data; private T data;} private Node head; { head = null; } private Node head; { head = null; } public GenericList() { head = null; } public GenericList() { head = null; } public void AddHead(T t) { public void AddHead(T t) { Node n = new Node(t); n.Next = head; head = n; } Node n = new Node(t); n.Next = head; head = n; } public IEnumerator GetEnumerator() { public IEnumerator GetEnumerator() { Node current = head; Node current = head; while (current != null) { while (current != null) { yield return current.Data; current = current.Next; } yield return current.Data; current = current.Next; } }}
Példakód – konkretizálás, használat class TestGenericList { static void Main() { GenericList list = new GenericList (); for (int x = 0; x < 10; x++) { list.AddHead(x); } list.AddHead(x); } foreach (int i in list) { System.Console.Write(i + " "); } System.Console.Write(i + " "); }System.Console.WriteLine("\nDone");}}
Példakód – generics fv. static void Swap (ref T lhs, ref T rhs) { T temp; T temp; temp = lhs; temp = lhs; lhs = rhs; lhs = rhs; rhs = temp; rhs = temp;} public static void TestSwap() { int a = 1; int a = 1; int b = 2; int b = 2; Swap (ref a, ref b); Swap (ref a, ref b); System.Console.WriteLine(a + " " + b); System.Console.WriteLine(a + " " + b);}