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
.
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" ?
Dokladnie tak.
http://4programmers.net/Edit/C_sharp/this
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