Kann ich einen überladenen Konstruktor von einem anderen Konstruktor derselben Klasse in C # aufrufen?
Kann ich einen überladenen Konstruktor von einem anderen Konstruktor derselben Klasse in C # aufrufen?
Antworten:
Wenn Sie meinen, wenn Sie eine Verkettung in C # durchführen können, lautet die Antwort Ja. Die Frage wurde bereits gestellt.
Allerdings scheint es , aus den Kommentaren, so scheint es , was Sie wirklich zu fragen beabsichtigen , ist ‚Kann ich von einem überladenen Konstruktor rufen in einem anderen Konstruktor mit Pre / Post - Processing?‘
Obwohl C # nicht über die entsprechende Syntax verfügt, können Sie dies mit einer allgemeinen Initialisierungsfunktion tun (wie in C ++, das die Verkettung von Ctors nicht unterstützt).
class A
{
//ctor chaining
public A() : this(0)
{
Console.WriteLine("default ctor");
}
public A(int i)
{
Init(i);
}
// what you want
public A(string s)
{
Console.WriteLine("string ctor overload" );
Console.WriteLine("pre-processing" );
Init(Int32.Parse(s));
Console.WriteLine("post-processing" );
}
private void Init(int i)
{
Console.WriteLine("int ctor {0}", i);
}
}
EDIT: Laut den Kommentaren zum ursprünglichen Beitrag ist dies eine C # -Frage.
Kurze Antwort: Ja, mit dem this
Schlüsselwort.
Lange Antwort: Ja, mit dem this
Schlüsselwort, und hier ist ein Beispiel.
class MyClass
{
private object someData;
public MyClass(object data)
{
this.someData = data;
}
public MyClass() : this(new object())
{
// Calls the previous constructor with a new object,
// setting someData to that object
}
}
In C # ist es nicht möglich, einen anderen Konstruktor innerhalb des Methodenkörpers aufzurufen. Sie können einen Basiskonstruktor folgendermaßen aufrufen: foo (args): base (), wie Sie selbst betont haben. Sie können auch einen anderen Konstruktor in derselben Klasse aufrufen: foo (args): this ().
Wenn Sie etwas tun möchten, bevor Sie einen Basiskonstruktor aufrufen, scheint die Konstruktion der Basisklasse von einigen externen Dingen abhängig zu sein. In diesem Fall sollten Sie Argumente des Basiskonstruktors verwenden, nicht Eigenschaften der Basisklasse oder ähnliches