Ich interessiere mich für den Unterschied zwischen this
und base
Objekt in C#
. Was ist die beste Vorgehensweise bei der Verwendung?Unterschied zwischen dieser und der Basis
Antwort
this
repräsentiert die aktuelle Klasseninstanz, während base
das übergeordnete Element ist. Anwendungsbeispiel:
public class Parent
{
public virtual void Foo()
{
}
}
public class Child : Parent
{
// call constructor in the current type
public Child() : this("abc")
{
}
public Child(string id)
{
}
public override void Foo()
{
// call parent method
base.Foo();
}
}
this
bezieht sich auf jedes Objekt, das gerade verwendet wird. Base
bezieht sich allgemein auf eine Basisklasse.
Wenn das Objekt von base
ist, dann kann in diesem Fall this
auf das Objekt base
auch verweisen.
this
bezieht sich auf die aktuelle Klasseninstanz.
base
bezieht sich auf die Basisklasse der aktuellen Instanz, dh auf die Klasse, von der sie abgeleitet ist. Wenn die aktuelle Klasse nicht explizit von irgendetwas abgeleitet wird base
bezieht sich auf die System.Object
Klasse (denke ich).
Die beiden Schlüsselwörter sind sehr unterschiedlich.
this
bezieht sich auf die aktuelle Instanz (nicht die „aktuelle Klasse“). Es kann nur in nicht statischen Methoden verwendet werden (da in einer statischen Methode keine aktuelle Instanz vorhanden ist). Wenn Sie eine Methode aufthis
aufrufen, wird die Methode genauso aufgerufen, wie wenn Sie sie für eine Variable aufgerufen haben, die dieselbe Instanz enthält.base
ist ein Schlüsselwort, das geerbten Methodenaufruf erlaubt,, d.h. es ruft die angegebene Methode vom Basistyp auf. Es kann auch nur in einer nicht-statischen Methode verwendet werden. Es wird normalerweise in einer virtuellen Methodenüberschreibung verwendet, kann aber tatsächlich zum Aufrufen einer beliebigen Methode im Basistyp verwendet werden. Es unterscheidet sich erheblich vom normalen Methodenaufruf, da es den normalen Versand virtueller Methoden umgeht: Es ruft die Basismethode direkt auf, auch wenn es virtuell ist.
Darin ist richtig dran. Ein Beispiel kann auch helfen. (Es gab kein Beispiel, wenn ich gepostet zunächst. Jetzt gibt es.)
class Base {
protected virtual void SayHi() {
Console.WriteLine("Base says hi!");
}
}
class Derived : Base {
protected override void SayHi() {
Console.WriteLine("Derived says hi!");
}
public void DoIt() {
base.SayHi();
this.SayHi();
}
}
Die oben druckt „Basis sagt hallo!“ gefolgt von "Abgeleitet sagt Hallo!"
können sagen, Sie haben Code wie dieser
class B extends A {
public B() {
// this will refer to the current object of class B
// base will refer to class A
}
}
Hinweis: Die Syntax von Code in Java, aber es ist selbsterklärend.
Base - wird verwendet, um von
Diese Mitglieder der Basisklasse für den Zugriff auf in einer abgeleiteten Klasse - bezieht sich auf die aktuelle Instanz der Klasse und vererbte
class BaseClass
{
public string BaseAttr { get; set; }
}
class A : BaseClass
{
public string Attr { get; set; }
public void Method()
{
this.Attr = "ok";
this.BaseAttr = "base ok";
base.BaseAttr = "ok";
base.Attr = "unavailable"; //!
}
}
„this
“ keyword zeigt auf die Adresse des aktuellen Objekts.wir können das Schlüsselwort "this
" verwenden, um das aktuelle Objekt (der aktuellen Klasse) darzustellen.
Wo als „base
“ Schlüsselwort „Parent-Klasse“ repräsentieren
Also, wenn Sie verwenden möchten/Call-Funktion der übergeordneten Klasse können Sie „base
“ Keyword verwenden.
base
ist sehr nützlich in Funktion überschreiben Funktion der Elternklasse zu nennen.
streng genommen bezieht sich dies auf die aktuelle Klasseninstanz, nicht auf den aktuellen Klassentyp. –
@Adrian, ja, guter Punkt. Aktualisiert meinen Beitrag zu berücksichtigen. –