Kann ich einen überladenen Konstruktor von einem anderen Konstruktor derselben Klasse in C # aufrufen?

202

Kann ich einen überladenen Konstruktor von einem anderen Konstruktor derselben Klasse in C # aufrufen?

Tomáš Zato - Monica wieder einsetzen
quelle
@ Malay: Über welche Sprache sprichst du? Wenn Sie über Java / C # sprechen, warum sollte dies eine Frage sein? Die Dokumentation soll Ihnen helfen, bevor Sie eine Frage stellen. Entschuldigung, wenn ich mich in meinem Verständnis irre.
Shahkalpesh
1
C # .. Ich kann den zweiten Konstruktor wie diesen foo (args) base () aufrufen, aber es ist möglich, diesen foo () zu tun {// mach etwas foo (args) // mach was}
23
@shahkalpesh, wie die Urheber dieses Forums oft gesagt haben, halten wir Benutzer nicht davon ab, grundlegende Fragen zu stellen. Bitte verzichten Sie auf RTFM-ähnliche Kommentare. @Malay, wie @shahkalpesh sagte, ist es in Java / C # sicherlich möglich. Bitte seien Sie genauer über die Sprache.
Rahul
Welche Sprache? Offensichtlich Malay ... ;-)
vegemite4me

Antworten:

229

No, You can't do that, the only place you can call the constructor from another constructor in C# is immediately after ":" after the constructor. for example

class foo
{
    public foo(){}
    public foo(string s ) { }
    public foo (string s1, string s2) : this(s1) {....}

}
mfawzymkh
quelle
84

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

EDIT: Laut den Kommentaren zum ursprünglichen Beitrag ist dies eine C # -Frage.

Kurze Antwort: Ja, mit dem thisSchlüsselwort.

Lange Antwort: Ja, mit dem thisSchlü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
   }
}
Ari Roth
quelle
1
Die Frage war nicht darüber, die Frage ist, ob Sie diese öffentliche MyClass () {// etwas tun können // dann lassen Sie uns einen anderen Konstruktor dies nennen (new object ()); /// das kannst du nicht! }
mfawzymkh
ist es möglich, foo zu klassifizieren: fooBase {public foo (string a): this foo (a, null): base (a) {} foo (string a, string b) {}}?
Arnis Lapsa
4
Die Frage war völlig danach - die Terminologie des OP war vielleicht falsch, aber das wollen die Leute wissen, wenn sie hierher kommen. +1
Robino
4

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

JaapM
quelle