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.

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