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.