»

sie 10

Linq inside (Extension methods)

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:

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ą.

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:

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 (tak interfejsy też można rozszerzać;). Każda kolekcja, a na nich właśnie operuje Linq, implementuje ten interfejs, więc aby dodać do wszystkich kolekcji jedną funkcjonalność panowie i panie z Mircosoftu wymyślili, właśnie mechanizm Extension Methods.

W następnym wpisie opiszę słowo kluczowe yield.

8 Komentarzy

Skip to comment form

  1. Arek Bal

    “Linq jest połączeniem “5″ elementów:”

    - IQueryable i Expression Trees

     

    1. graf

      Jasne dzieki za zwrócenie uwagi.

  2. Roman

    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++)

    1. graf

      To mialo sluzyc tylko za przyklad, ale oczywiscie masz racje.

  3. Michał

    Bardzo fajny wpis. Jasno i konkretnie.

  4. Mateusz

    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:)

    1. graf

      Ok, poprawiłem. Dzięki za znalezienie błędu.

  5. Mateusz

    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

Odpowiedz na „MichałAnuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć tych znaczników i atrybutów HTMLa: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Current day month ye@r *