C#

Słowa kluczowe this i base

xeo545x39

Wstęp

W tym artykule zapoznasz się z działaniem słów kluczowych this i base w języku C#.

this

Słowo this jak sama nazwa wskazuje, to odwołanie klasy do samej siebie czyli do jej obecnej instancji, jeżeli działamy wewnątrz niej. Krótki przykład:

class Foo
{
    private int Bar;
 
    public Foo()
    {
        this.Bar = 45; // równoznaczne z `Bar = 45;
    }
}

Słowo this może być stosowane dla estetyki, ale główne zastosowanie jest przy przekazywaniu parametrów i indexer'ach. Przy przekazywaniu parametrów kompilator faktycznie musi wiedzieć, do którego pola chcemy się odwołać.

class Foo
{
    private int Bar;
 
    public Foo(int Bar)
    {
        this.Bar = Bar; // bez `this` kompilator pomyślałby, że to przypisanie parametru samo do siebie
    }
}

Równie dobrze chcąc przekazać aktualną instancję do innej klasy użyjemy this:

class Bar
{
    public Bar(Foo obj)
    {
    }
}
 
class Foo
{
    private Bar bar;
 
    public Foo()
    {
        bar = new Bar(this);
    }
 
}

Słowa this użyjemy też do indexer'ów, by móc korzystać z operatora [] w klasie.

class Foo
{
    private List<int> list;
 
    public int this[int index]
    {
        get
        {
            // jakieś operacje na danym elemencie listy
            return list[index];
        }
    }
 
    public Foo()
    {
        list = new List<int>();
    }
}
 
// ...
 
void Main(string[] args)
{
    Foo foo = new Foo();
    // operacje, które zapełniają listę
    Console.Write(foo[10]);
}
Pamietajmy, że klasy statyczne nie posiadają słowa kluczowego `this`, ponieważ nie jest tworzona żadna ich instancja, wobec tego nie możemy się do tejże instancji odwołać.

base

Słowo kluczowe base to podobnie jak this odwołanie do klasy, ale w tym przypadku klasy bazowej o ile takowa jest. Podczas dziedziczenia często potrzebujemy dostać się do metod, pól, właściwości, które są częścią klasy bazowej, a w naszej klasie potomnej są pola o takiej samej nazwie. Dla kompilatora ważniejsze są zmienne z naszej klasy pochodnej, nie bazowej, ale jeżeli chcemy dostać się do pól i metod klasy bazowej użyjemy słowa base:

class Baza
{
    int pole;
}
 
class Pochodna : Baza
{
    int pole;
    public Pochodna()
    {
        base.pole = 25; // ustawiamy pole klasy bazowej
        pole = 100; // ustawiamy pole klasy pochodnej
    }
}

Słowo kluczowe base jest też wykorzystywane przy konstruktorze klas pochodnych, aby wywołać konstruktor klasy bazowej:

class Baza
{
    public Baza(int arg)
    {
    }
}
 
class Pochodna : Baza
{
    public Pochodna(int arg)
        : base(arg)
    {
        // przekazaliśmy konstruktorowi bazy argument `arg`
    }
}
Gdy nie dziedziczyliśmy naszej klasy, to domyślną bazą dla każdego obiektu na platformie .NET jest `Object`.
C#

6 komentarzy

Dokładnie, nie wiem czemu to wtedy przeoczyłem.

Jest błąd przy słowie kluczowym: base! Klasa "Pochodna" powinna dziedzieczy po "Baza" aby mógł użyć :base w konstruktorze.
class Pochodna : Baza

Hej. Jestem świeży w C# i dopiero ogarniam (przesiadka z C++), ale czy nie powinno tu być przy opisie słowa kluczowego "base" jakiejś hierarchi dziedziczenia "class Pochodna : public Baza" ?

No dobra, tylko dać je do słów kluczowych, czy tak jak teraz normalnie artykuł w C#?

Proponuje rozbic ten artykul na dwa rozne. Tak samo jak w dziale Delphi, kazde slowo jest osobno opisane. Mielibysmy tekst pod adresem http://4programmers.net/C_sharp/base oraz http://4programmers.net/C_sharp/this