Menu
Coddy logo textTech

Metody rozszerzające

Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 39 z 70.

Metody rozszerzające pozwalają dodawać nowe metody do istniejących typów bez modyfikowania ich kodu źródłowego ani tworzenia klas pochodnych. Wyglądają tak, jakby były natywnymi metodami danego typu, dzięki czemu kod jest bardziej czytelny i intuicyjny.

Aby utworzyć metodę rozszerzającą, zdefiniuj metodę statyczną w klasie statycznej, poprzedzając pierwszy parametr słowem kluczowym this:

public static class StringExtensions
{
    public static int WordCount(this string str)
    {
        return str.Split(' ').Length;
    }
}

Teraz możesz wywołać tę metodę bezpośrednio na dowolnym ciągu znaków:

string sentence = "Hello World Today";
int count = sentence.WordCount();  // 3

Parametr this string str informuje kompilator, że ta metoda rozszerza typ string. Gdy wywołujesz sentence.WordCount(), kompilator tłumaczy to w tle na StringExtensions.WordCount(sentence).

Metody rozszerzające mogą również przyjmować dodatkowe parametry:

public static bool IsLongerThan(this string str, int length)
{
    return str.Length > length;
}

// Użycie
bool result = "Hello".IsLongerThan(3);  // true

Ta technika jest szeroko stosowana w LINQ, gdzie metody takie jak Where() i Select() są metodami rozszerzającymi dla IEnumerable. Metody rozszerzające są przydatne do dodawania funkcji pomocniczych do typów, nad którymi nie masz kontroli, dzięki czemu Twój kod pozostaje przejrzysty i wyrazisty.

challenge icon

Wyzwanie

Łatwy

Stwórzmy zestaw przydatnych metod rozszerzających dla liczb całkowitych, które dodają wygodne funkcje, jakich można oczekiwać od metod wbudowanych. Utworzysz klasę statyczną zawierającą metody rozszerzające, które można wywoływać bezpośrednio na dowolnej liczbie całkowitej, dzięki czemu Twój kod będzie bardziej wyrazisty i czytelny.

Uporządkujesz kod w dwóch plikach:

  • IntExtensions.cs: Utwórz klasę statyczną o nazwie IntExtensions w przestrzeni nazw Utilities. Ta klasa będzie zawierać metody rozszerzające, które rozszerzają typ int:
    • IsEven() - zwraca true, jeśli liczba jest parzysta, w przeciwnym razie false
    • Square() - zwraca liczbę pomnożoną przez samą siebie
    • IsInRange(int min, int max) - zwraca true, jeśli liczba mieści się w zakresie od min do max (włącznie), w przeciwnym razie false
    Pamiętaj, że metody rozszerzające muszą być metodami statycznymi w klasie statycznej, a ich pierwszy parametr musi używać słowa kluczowego this, aby określić, jaki typ rozszerzasz.
  • Program.cs: W pliku głównym wczytaj liczbę całkowitą z wejścia i zaprezentuj wszystkie trzy metody rozszerzające. Wywołaj każdą metodę bezpośrednio na liczbie całkowitej, tak jakby była metodą wbudowaną, a następnie wypisz wyniki.

Otrzymasz trzy dane wejściowe:

  • Liczba do sprawdzenia (liczba całkowita)
  • Minimalna wartość do sprawdzenia zakresu (liczba całkowita)
  • Maksymalna wartość do sprawdzenia zakresu (liczba całkowita)

Wypisz wynik w tym formacie:

Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}

Na przykład, jeśli danymi wejściowymi są 7, 5 i 10, wynik powinien wyglądać następująco:

Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? True

Zwróć uwagę, jak naturalnie można napisać number.IsEven() i number.Square() — metody rozszerzające sprawiają wrażenie, jakby od zawsze były częścią typu liczby całkowitej!

Spróbuj swoich sił

using System;
using Utilities;

class Program
{
    public static void Main(string[] args)
    {
        // Wczytaj dane wejściowe
        int number = Convert.ToInt32(Console.ReadLine());
        int min = Convert.ToInt32(Console.ReadLine());
        int max = Convert.ToInt32(Console.ReadLine());

        // TODO: Użyj metod rozszerzających dla 'number' i wypisz wyniki
        // Wywołaj number.IsEven(), number.Square() i number.IsInRange(min, max)
        // Wypisz w formacie:
        // Czy {number} jest parzyste? {True/False}
        // Kwadrat liczby {number}: {result}
        // Czy {number} mieści się w przedziale [{min}-{max}]? {True/False}

    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C# online