Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Generics w .NET 2.0 Łukasz Rzeszot.

Podobne prezentacje


Prezentacja na temat: "Generics w .NET 2.0 Łukasz Rzeszot."— Zapis prezentacji:

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


Pobierz ppt "Generics w .NET 2.0 Łukasz Rzeszot."

Podobne prezentacje


Reklamy Google