same - konstruktor c# erklärung




: Diese(foo) Syntax in C#-Konstruktoren? (5)

Dein Bauchgefühl stimmt. Die Syntax wird verwendet, um überladene Konstruktoren in derselben Klasse aufzurufen:

public class Test
{
    public Test() : this("Called from default constructor") { }
    public Test(String msg)
    {
        Console.WriteLine(msg);
    }
}

Der folgende Code:

public static void Main(String[] args)
{
    Test t1 = new Test();
    Test t2 = new Test("Called from Main function");
}

Gibt Folgendes aus

Called from default constructor
Called from main function

In ähnlicher Weise wird : base(someParams) zum Aufrufen von Basiskonstruktoren verwendet.

Hin und wieder stoße ich auf die Syntax, die ich vorher gesehen, aber nie benutzt habe. Dies ist eine dieser Zeiten.

Kann jemand den Zweck von ": this" oder ": base" nach einer C # -Konstruktormethode erklären?

Beispielsweise:

public MyClass(SomeArg arg) : this(new SomethingElse(), arg)
{
}

Mein Bauchgefühl ist, dass es verwendet wird, um ein Standardargument auf eine andere Konstruktormethode abzubilden.


Du hast grundsätzlich recht. this() ruft einen Konstruktor für die aktuelle Instanz auf, base() ruft den Konstruktor des Supertyps für die aktuelle Instanz auf. Sie werden im Allgemeinen verwendet, um Überladungen von Konstruktoren zu behandeln, sodass Sie zusätzliche Optionen hinzufügen können, ohne dass die Dinge in eine separate Methode aufgeteilt werden müssen.


Es ist so, wenn ich mich nicht irre:

public MyClass(SomeArg arg) : this(new SomethingElse(), arg)

werde anrufen

public MyClass(SomethingElse arg, SomeArg arg1) : base or this or nothing

und das wird weitergehen, bis du eine Basis hast oder nichts.

Wenn Sie base(....) haben, wird der Konstruktor, der das hat, den Basiskonstruktor mit den Parametern (falls vorhanden) aufrufen, die wiederum an seine eigenen Konstruktoren (dasselbe Spiel) delegieren können.

Wenn Sie nichts haben, wird der parameterlose Konstruktor der Basisklasse automatisch aufgerufen.

Nachdem Sie this(....) , wird der Konstruktor verwendet, der den Parametern entspricht, und sein Body wird ausgeführt - zusätzlich zum Rumpf des Konstruktors, der this(....) .


Genau. Der Aufruf von Constructor Chaining wird verwendet, um die Tatsache zu umgehen, dass C # keine Standardargumente ausführen kann.

Dies wird häufig in IoC verwendet.


Jeder Konstruktor in einer .NET-Klasse stellt sicher, dass ein Konstruktor in der Klasse, von der er erbt, ebenfalls aufgerufen wird.

Also wenn du folgende Klassen hast:

public class Base { }
public class Something : Base { }
public class Else : Something { }

Dann ruft ein Konstruktor in Else einen Konstruktor in Something auf, der auch einen Konstruktor in Base aufruft.

Der Konstruktor, der eine Basisklasse aufgerufen hat (dh diejenige, von der Sie abstammen), ist immer der parameterlose Konstruktor.

Wenn Sie keine haben oder diese überschreiben möchten, können Sie sie überschreiben, indem Sie die Basis angeben (einige Parameter hier). Dies wird den richtigen Konstruktor in der Basisklasse auswählen.

Sie können auch einen Konstruktor bitten, zuerst auf derselben Ebene einen anderen Konstruktor in derselben Klasse aufzurufen. Dies kann verwendet werden, um zu vermeiden, dass Konstruktorcode in mehreren Konstruktoren dupliziert wird. Schließlich rufen die aufgerufenen Konstruktoren einen Konstruktor in der Basisklasse auf.

Ich hoffe, das war verständlich.





constructor-chaining