Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Generics w .NET 2.0 Łukasz Rzeszot
2
Agenda Co to są Generics Jakie są zalety ich użycia
Do czego są wykorzystywane Jak się je implementuje Jak można nakładać ograniczenia
3
Co to są Generics Jest nowym rozwiązaniem dodanym do Platformy .NET 2.0 C# rozwiązanie podobne jest do generics w jezyku Eiffel, Ada lub szablonów w C++. Generics pozwalają na tworzenie struktur danych, w których nie trzeba wskazywać konkretnego typu ponieważ zastępują je parametry.
4
Zalety Kontrola typów Możliwość ponownego użycia Przejrzystość kodu
Zwiększenie wydajności - nie trzeba rzutować po wyciągnięciu obiektu ze struktury danych - nie trzeba opakowywać typów prostych
5
Wydajność
6
Wsparcie dla Generics W C# pojawiły się nowe klasy i interfejsy by wesprzeć rozwiązanie Generics
7
Jak to działa Kompilacja obiektów typu generycznego przebiega tak jak kompilacja normalnego typu. Obiekt kompilowany jest do IL (Intermediate Language) i tworzone są metadane. IL i metadane zawierają informacje, o tym że jest to typ generyczny. W czasie dziłania programu, kiedy odwołujemy się do obiektu precyzując typ np. List <int> System sprawdza, czy było już odwołanie do List<int> Jeśli nie, to zamiast T podstawiany jest parametr int
8
Przykłady Listę parametrów określających ogólnikowe typy wpisujemy za nazwą klasy, interfejsu, funkcji. class Kolekcja<A, B> interface INode<A> T DoSth<T>(int a, int b)
9
Przykłady Rozwiązanie standardowe public class Stack { object[] items;
int count; public void Push(object item) {...} public object Pop() {...} } Stack stack = new Stack(); stack.Push(new Customer()); Customer c = (Customer)stack.Pop(); Generics public class Stack<T> { T[] items; int count; public void Push(T item) {...} public T Pop() {...} } Stack<int> stack = new Stack<int>(); stack.Push(3); int x = stack.Pop();
10
Przykład Przykładowe użycie klasy Dictionary stworzonej na potrzeby Generics public class Dictionary<K,V> { public void Add(K key, V value) {...} public V this[K key] {...} } Dictionary<string, Customer> d = new Dictionary<string, Customer>(); d.Add("Peter", new Customer()); Customer c = d ["Peter"];
11
Ograniczenia (Constraints)
Dzięki ograniczeniom możemy upewnić się, że przekazywany parametr jest dokładnie tym, czego sobie życzymy. where T : struct // Parametr T jest typu value where T : class // Parametr T jest typu referencyjnego where T : new() // T musi posiadać konstruktor bezparametrowy, jeśli używamy tego ograniczenia to new() musi znaleźć się na końcu listy np. where T : Person, new(); where T : <nazwa klasy bazowej> T musi być jakąś klasą lub jej pochodną np. T : Person where T : <nazwa interfejsu> T musi implementować wybrany interfejs. Można nałożyć kilka ograniczeń tego typu tak by T implementowało wiele interfejsów np. where T : ICollection, IEnumerable where T : <nazwa innego parametru> T musi być tego samego typu co inny parametr np. where T : T2;
12
Ograniczenia (Constraints)
Ograniczenia mogą być łączone: where T : Person, IComparable, new(); Co oznacza, że T musi nie tylko być klasy Person lub z klasy pochodnej, musi także implementować interfejs IComparable i mieć konstruktor bezparametrowy.
13
Ograniczenia (Constraints)
public class MyClass<A, B, C> : klasa_bazowa, interfejs1, interfejs2 where A : B where C : struct Klasa MyClass dziedziczy z klasy bazowej, implementuje interfejsy 1 i 2, ale także ma parametry, z których A i B będą tego samego typu, a C będzie typem prostym public C Function<A, B, C> (A a, B b) where A : ICollection Funkcja przyjmuje sparametryzowane argumenty. Parametr A implemenuje dodatkowo interfejs IColleciont
14
Dziedziczenie Jeżeli klasa dziedziczy z klasy generycznej to musi być podany konkretny typ jako parametr: public class BaseClass<T>{...} public class SubClass : BaseClass<int>{...} Chyba że klasa i podklasa są sparametryzowane tym samym parametrem: public class SubClass<T> : BaseClass<T> {...} Przy dziedziczeniu należy powtarzać ograniczenia w podklasach public class BaseClass<T> where T : ISomeInterface {...} public class SubClass<T> : BaseClass<T> where T : ISomeInterface{...}
15
Koniec
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.