Klasy i Metody Statyczne w C#

Co to jest klasa statyczna?

Definicja

Klasa statyczna to klasa, która nie może być zainicjowana, czyli nie można utworzyć jej obiektu za pomocą słowa kluczowego new. Wszystkie jej członkowie (metody, właściwości, pola) muszą być statyczni.

Właściwości klas statycznych

  • Brak instancji: Nie można tworzyć obiektów klasy statycznej.
  • Statyczni członkowie: Wszystkie metody, pola i właściwości muszą być oznaczone jako static.
  • Konstruktor statyczny: Klasa statyczna może mieć statyczny konstruktor, który jest wywoływany automatycznie przed pierwszym użyciem klasy.
  • Organizacja kodu: Służy do grupowania metod i danych, które są niezależne od obiektów.

Kiedy stosować klasy statyczne?

  • Funkcje pomocnicze: Gdy potrzebujesz zestawu metod, które wykonują operacje niezależne od instancji (np. obliczenia matematyczne, konwersje).
  • Stałe wartości: Do przechowywania stałych, które są wspólne dla całego programu.
  • Organizacja kodu: Gdy chcesz pogrupować powiązane metody i dane w jednym miejscu.

Przykład klasy statycznej

public static class Kalkulator
{
    public static int Dodaj(int a, int b)
    {
        return a + b;
    }

    public static int Odejmij(int a, int b)
    {
        return a - b;
    }
}

Użycie:

int suma = Kalkulator.Dodaj(5, 3); // Wynik: 8

Co to jest metoda statyczna?

Definicja

Metoda statyczna to metoda, która należy do klasy, a nie do konkretnego obiektu tej klasy. Oznacza to, że można ją wywołać bez tworzenia instancji klasy.

Właściwości metod statycznych

  • Wywoływanie bez obiektu: Można je wywołać używając nazwy klasy.
  • Brak dostępu do this: Nie mają dostępu do kontekstu instancji, ponieważ nie są powiązane z konkretnym obiektem.
  • Dostęp tylko do statycznych członków: W metodzie statycznej można używać tylko innych statycznych pól i metod tej samej klasy.

Kiedy stosować metody statyczne?

  • Operacje niezależne od stanu obiektu: Gdy metoda nie musi korzystać z danych instancji klasy.
  • Funkcje pomocnicze: Do wykonywania ogólnych operacji, takich jak obliczenia czy manipulacje danymi.
  • Fabryki obiektów: Metody statyczne mogą tworzyć i zwracać nowe obiekty.

Przykład metody statycznej w klasie niestatycznej

public class Osoba
{
    public string Imie { get; set; }
    public string Nazwisko { get; set; }
    public static int LiczbaOsob { get; private set; }

    public Osoba(string imie, string nazwisko)
    {
        Imie = imie;
        Nazwisko = nazwisko;
        LiczbaOsob++;
    }

    public static void PokazLiczbeOsob()
    {
        Console.WriteLine($"Liczba osób: {LiczbaOsob}");
    }
}

Użycie:

Osoba o1 = new Osoba("Jan", "Kowalski");
Osoba o2 = new Osoba("Anna", "Nowak");
Osoba.PokazLiczbeOsob(); // Wyświetli: Liczba osób: 2

Praktyczne zastosowanie

Klasa statyczna Math

Język C# dostarcza wbudowaną klasę statyczną Math, która zawiera wiele metod statycznych do wykonywania operacji matematycznych.

double wynik = Math.Pow(2, 3); // Wynik: 8
double pierwiastek = Math.Sqrt(16); // Wynik: 4

Tworzenie własnej klasy statycznej

Przykład: Konwerter temperatur

public static class KonwerterTemperatur
{
    public static double CelsiusNaFahrenheit(double celsius)
    {
        return (celsius * 9 / 5) + 32;
    }

    public static double FahrenheitNaCelsius(double fahrenheit)
    {
        return (fahrenheit - 32) * 5 / 9;
    }
}

Użycie:

double tempF = KonwerterTemperatur.CelsiusNaFahrenheit(25); // Wynik: 77
double tempC = KonwerterTemperatur.FahrenheitNaCelsius(77); // Wynik: 25

Zasady i dobre praktyki

  • Kiedy używać klas statycznych?
    • Gdy wszystkie członkowie klasy są statyczni.
    • Gdy chcesz zapobiec tworzeniu instancji klasy.
    • Do grupowania metod pomocniczych.
  • Unikaj nadmiernego użycia metod statycznych:
    • Jeśli metoda powinna operować na danych instancji, nie powinna być statyczna.
    • Nadmierne używanie metod statycznych może utrudniać testowanie i rozszerzanie kodu.
  • Dostęp do statycznych pól i metod:
    • Z poziomu instancji klasy można odwoływać się do statycznych członków, ale zaleca się używanie nazwy klasy dla czytelności.

Ćwiczenia:

Zadanie 1: Klasa statyczna OperacjeMatematyczne

Stwórz klasę statyczną OperacjeMatematyczne, która zawiera następujące metody statyczne:

  • int Silnia(int n) – oblicza silnię liczby naturalnej n.
  • bool CzyPierwsza(int n) – sprawdza, czy liczba n jest liczbą pierwszą.

Wskazówki:

  • Silnia: n! = n * (n - 1) * ... * 1
  • Liczba pierwsza: Liczba większa od 1, która dzieli się tylko przez 1 i samą siebie.
int wynikSilnia = OperacjeMatematyczne.Silnia(5); // Wynik: 120
bool czyPierwsza = OperacjeMatematyczne.CzyPierwsza(7); // Wynik: true

Zadanie 2: Metoda statyczna w klasie niestatycznej

W klasie Samochod dodaj statyczne pole LiczbaSamochodow, które będzie zliczać, ile obiektów klasy Samochod zostało utworzonych. Dodaj również statyczną metodę PokazLiczbeSamochodow().

Przykład użycia:

Samochod s1 = new Samochod("Toyota", "Corolla");
Samochod s2 = new Samochod("Ford", "Focus");
Samochod.PokazLiczbeSamochodow(); // Wyświetli: Liczba samochodów: 2