Rola operatora „this”

Operator this to specjalne słowo kluczowe w C#, które odnosi się do bieżącego obiektu (instancji klasy), na którym pracujemy. Można go używać w metodach, konstruktorach i właściwościach klasy, aby odwołać się do pól i metod należących do konkretnej instancji tej klasy.

Mówiąc prościej, operator this pozwala nam:

  • Odwołać się do bieżącego obiektu, na którym aktualnie operujemy.
  • Rozróżnić między polami klasy a parametrami metody, gdy mają te same nazwy.
  • Przekazać bieżący obiekt jako argument do innej metody lub klasy.

Podstawowe zastosowanie this

Najczęściej używamy operatora this w sytuacjach, gdy nazwy parametrów metody lub konstruktora pokrywają się z nazwami pól klasy. Operator this pozwala rozróżnić te nazwy i jednoznacznie wskazać, że odnosimy się do pola klasy, a nie do parametru.

Przykład bez operatora this (z problemem):

public class Samochod
{
    public string Marka;

    // Konstruktor z parametrem o tej samej nazwie co pole klasy
    public Samochod(string Marka)
    {
        Marka = Marka;  // Błąd - przypisanie parametru samego sobie
    }
}

W powyższym przykładzie występuje problem – konstruktor przypisuje parametr samego sobie, ponieważ Marka w obrębie konstruktora odnosi się do parametru, a nie do pola klasy. W takiej sytuacji używamy operatora this.

Przykład z operatorem this:

public class Samochod
{
    public string Marka;

    // Konstruktor z użyciem operatora this
    public Samochod(string Marka)
    {
        this.Marka = Marka;  // Poprawne przypisanie pola klasy
    }

    public void WyswietlMarke()
    {
        Console.WriteLine("Marka: " + this.Marka);
    }
}

// Tworzenie obiektu klasy Samochod
Samochod auto = new Samochod("Toyota");
auto.WyswietlMarke();  // Wypisze: Marka: Toyota

Operator this.marka wskazuje na pole klasy marka, a nie na parametr o tej samej nazwie.

Konstruktor przypisuje wartość przekazaną przez parametr do pola Marka bieżącego obiektu.

Użycie this w konstruktorach

Oprócz tego, że operator this odnosi się do bieżącego obiektu, w konstruktorach może być także używany do wywoływania innych konstruktorów tej samej klasy, co pozwala na kod bardziej zwięzły i uniknięcie powtarzania kodu.

Przykład wywołania innego konstruktora za pomocą this:

public class Samochod
{
    public string Marka;
    public string Model;

    // Konstruktor domyślny
    public Samochod() : this("Nieznana", "Nieznany") {}

    // Konstruktor parametryzowany
    public Samochod(string Marka, string Model)
    {
        this.Marka = Marka;
        this.Model = Model;
    }

    public void WyswietlInformacje()
    {
        Console.WriteLine("Marka: " + Marka + ", Model: " + Model);
    }
}

// Tworzenie obiektu z użyciem konstruktora domyślnego
Samochod auto = new Samochod();
auto.WyswietlInformacje();  // Wypisze: Marka: Nieznana, Model: Nieznany

Konstruktor domyślny Samochod() wywołuje konstruktor parametryzowany przy użyciu this("Nieznana", "Nieznany"). Dzięki temu konstruktor domyślny nie musi powielać kodu z konstruktora parametryzowanego.

Przekazywanie bieżącego obiektu (this) do metod

Możemy użyć operatora this, aby przekazać bieżący obiekt do innej metody, która operuje na tym obiekcie.

Przykład przekazania this jako argument:

public class Samochod
{
    public string Marka;
    public string Model;

    public Samochod(string Marka, string Model)
    {
        this.Marka = Marka;
        this.Model = Model;
    }

    public void PokazSzczegoly()
    {
        Console.WriteLine("Marka: " + Marka + ", Model: " + Model);
    }

    public void PrzekazObiekt(Samochod innySamochod)
    {
        Console.WriteLine("Porównujemy samochody:");
        innySamochod.PokazSzczegoly();  // Wywołanie metody dla przekazanego obiektu
    }

    public void PorownajZInnymSamochodem()
    {
        PrzekazObiekt(this);  // Przekazanie bieżącego obiektu do innej metody
    }
}

// Tworzenie obiektu
Samochod auto = new Samochod("BMW", "X5");
auto.PorownajZInnymSamochodem();  // Wypisze: Marka: BMW, Model: X5

W metodzie PorownajZInnymSamochodem() bieżący obiekt (reprezentowany przez this) jest przekazywany jako argument do metody PrzekazObiekt().

Dzięki temu metoda PrzekazObiekt() operuje na tym samym obiekcie, który wywołał metodę PorownajZInnymSamochodem().

this w kontekście właściwości

W przypadku używania właściwości (properties) w klasach, operator this może być używany do jednoznacznego odwoływania się do pól klasy, szczególnie gdy używamy złożonych metod dostępu (get i set).

Przykład użycia this w właściwościach:

public class Prostokat
{
    private int szerokosc;
    private int wysokosc;

    public int Szerokosc
    {
        get { return szerokosc; }
        set { this.szerokosc = value; }  // Użycie this dla ustawienia wartości pola
    }

    public int Wysokosc
    {
        get { return wysokosc; }
        set { this.wysokosc = value; }  // Użycie this dla ustawienia wartości pola
    }

    public int ObliczPole()
    {
        return this.Szerokosc * this.Wysokosc;
    }
}

// Tworzenie obiektu klasy Prostokat
Prostokat prostokat = new Prostokat();
prostokat.Szerokosc = 5;
prostokat.Wysokosc = 10;
Console.WriteLine("Pole prostokąta: " + prostokat.ObliczPole());  // Wypisze: Pole prostokąta: 50

W metodach set właściwości Szerokosc i Wysokosc, operator this używany jest do jednoznacznego odwoływania się do prywatnych pól klasy.

W metodzie ObliczPole() operator this jest używany do wywoływania właściwości Szerokosc i Wysokosc.

Podsumowanie: Rola operatora this

  • Operator this odnosi się do bieżącego obiektu klasy i pozwala jednoznacznie odwoływać się do jego pól, metod i właściwości.
  • Używany w konstruktorach, gdy nazwy parametrów są takie same jak nazwy pól klasy.
  • Umożliwia wywoływanie innych konstruktorów tej samej klasy, co pozwala na zwięzły i dobrze zorganizowany kod.
  • Może być używany do przekazywania bieżącego obiektu jako argument do innych metod.