Kann ich einen überladenen Konstruktor von einem anderen Konstruktor derselben Klasse in C # aufrufen?
Nein, das können Sie nicht. Sie können den Konstruktor von einem anderen Konstruktor in C # nur direkt nach dem Konstruktor ":" aufrufen. beispielsweise
class foo
{
public foo(){}
public foo(string s ) { }
public foo (string s1, string s2) : this(s1) {....}
}
Wenn Sie damit sagen, dass Sie eine Verkettung in C # durchführen können, lautet die Antwort Ja. Die Frage wurde bereits gestellt.
Wie auch immer aus den Kommentaren hervorgeht, es scheint, als wollten Sie wirklich fragen: 'Kann ich einen überladenen Konstruktor von innerhalb eines anderen Konstruktors mit Vor-/Nachbearbeitung aufrufen ?
Obwohl C # nicht die Syntax dafür hat, können Sie dies mit einer allgemeinen Initialisierungsfunktion tun (wie Sie es in C++ tun würden, das keine CTOR-Verkettung 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);
}
}
BEARBEITEN: Laut den Kommentaren zum Originalbeitrag handelt es sich um eine C # -Frage.
Kurze Antwort: Ja, mit dem Schlüsselwort this
.
Lange Antwort: Ja, mit dem Schlüsselwort this
, 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 Base-Konstruktor 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 Basis klassenabhängig von einigen externen Dingen zu sein. In diesem Fall sollten Sie die Argumente des Basiskonstruktors verwenden und nicht die Eigenschaften der Basisklasse oder ähnliches festlegen