wake-up-neo.com

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?

190
Malay

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) {....}

}
222
mfawzymkh

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);
   }
}
80
Gishu

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
   }
}
37
Ari Roth

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

4
JaapM