Blogowania chciałem rozpocząć od cyklu wpisów o Linq.
Każdy dobry programista C# powinien umieć się posługiwać Linq, nie każdy niestety wie jak to właściwie działa.
Linq wprowadza wspólny interfejs do pracy z kolekcjami niezależnie od źródła danych.
Linq jest połączeniem 5 elementów:
- extension methods
- yield
- Func, Predicate, Action
- wyrażenia lambda
- IQueryable i Expression Trees
W tym poście omówię extension methods czyli metody rozszerzające.
Extension methods jak sama nazwa wskazuje służą do rozszerzania tylko czego?
Jest to sposób na dodanie funkcjonalności do klasy, do której nie mamy kodu źródłowego
i tak możemy rozszerzyć np. klasę DateTime lub Int.
Metoda rozszerzająca to zwykła statyczna metoda w statycznej klasie, jedyna co ją wyróżnia to to że przed pierwszym parametrem jest słowo kluczowe this. Dzięki temu kompilator wie jaki typ chcemy rozszerzyć.Poniżej przykład takiej metody. Sprawdza ona czy liczba number jest liczbą pierwszą.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
namespace LinqSeries.Extesions { public static class IntExtensions { public static bool IsPrime(this int number) { bool result = true; for (int i = 2; i <=Math.Sqrt(number); i++) { if (number % i == 0) { result = false; break; } } return result; } } } |
Aby użyć tak zdefiniowanej metody należy pamiętać o zaimportowaniu przestrzeni nazw, w której zdefiniowana jest metoda rozszerzająca.
Metoda rozszerzająca w użyciu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using LinqSeries.Extestions; namespace LinqSeries { class Program { static void Main(string[] args) { var random = new Random(); var number = random.Next(20); Console.WriteLine("{0} is prime {1}",number,number.IsPrime()); } } } |
Kilka faktów o extension methods:
- metoda zawsze musi być zadeklarowana jako statyczna, w statycznej klasie
- klasa statyczna zawierająca taką metodę, nie może przyjmować parametrów generycznych
- metoda rozszerzająca nigdy nie przykryje metody zdefiniowanej bezpośrednio w klasie rozszerzanej
- definiując metodę rozszerzającą mamy dostęp tylko do publicznych składowych klasy rozszerzanej
Wracając do Linq. Wszystkie metody Linq są metodami rozszerzającymi. Tylko co właściwie rozszerzają? Otóż rozszerzają wspólną cechę wszystkich kolekcji czyli IEnumerable
W następnym wpisie opiszę słowo kluczowe yield.
8 Komentarzy
Skip to comment form ↓
Arek Bal
12 sierpnia 2013 na 11:30 (UTC 2) Link do tego komentarza
“Linq jest połączeniem “5″ elementów:”
- IQueryable i Expression Trees
graf
12 sierpnia 2013 na 12:55 (UTC 2) Link do tego komentarza
Jasne dzieki za zwrócenie uwagi.
Roman
14 sierpnia 2013 na 15:59 (UTC 2) Link do tego komentarza
W pętli możesz ograniczyć się do sqrt(number), dla dużych liczb jest to znacząca różnica.
for (int i = 2; i < Math.Sqrt(number); i++)
graf
14 sierpnia 2013 na 18:11 (UTC 2) Link do tego komentarza
To mialo sluzyc tylko za przyklad, ale oczywiscie masz racje.
Michał
26 sierpnia 2013 na 11:59 (UTC 2) Link do tego komentarza
Bardzo fajny wpis. Jasno i konkretnie.
Mateusz
9 września 2013 na 13:14 (UTC 2) Link do tego komentarza
wiem, że chodzi o samo wytłumaczenie ExM, ale samo zadanie chyba w niektórych przypadkach daje błędny wynik, ponieważ dla 4 daje True:)
graf
9 września 2013 na 18:51 (UTC 2) Link do tego komentarza
Ok, poprawiłem. Dzięki za znalezienie błędu.
Mateusz
10 września 2013 na 11:48 (UTC 2) Link do tego komentarza
Może następny wpis to kilka – kilkanaście przykładów o zastosowaniu tych 5 elementów w praktyce?
Pomogłoby to zapewne początkującym
Od prostych…do bardziej skomplikowanych