2009-06-12 3 views
170

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

+0

welcher Sprache? ... –

+0

@Malay: In welcher Sprache sprichst du? Wenn Sie über Java/C# sprechen, warum sollte das eine Frage sein? Die Dokumentation sollte Ihnen helfen, bevor Sie eine Frage stellen. Entschuldigung, wenn ich falsch verstanden habe. – shahkalpesh

+0

C# .. kann ich zweiten Konstruktor wie diese foo (args) base() nennen, aber ist es möglich, wie diese foo() zu tun { // Etwas foo (args) // etwas tun } –

Antwort

32

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

Kurze Antwort: Ja, mit dem Schlüsselwort this.

Lange Antwort: Ja, mit dem this Schlüsselwort, und hier ist ein Beispiel. Keine

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 
    } 
} 
+1

die Frage nach war dies nicht, die Frage zu stellen, wenn Sie diese öffentlichen MyClass tun können() { // Etwas // dann lassen Sie uns einen anderen Konstruktor aufrufen diese (neues Objekt()); /// Du kannst das nicht tun! } – mfawzymkh

+0

danke mfaawymkh ... so kann ich das nicht tun. –

+0

Ah ha, ich verstehe jetzt. Ja, kann nicht gemacht werden. –

207

, Sie können das nicht tun, den einzigen Ort, können Sie den Konstruktor aus einem anderen Konstruktor in C# nennen, ist unmittelbar nach dem „:“ nach dem Konstruktor. beispiels

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

} 
4

In C# ist es nicht möglich, eine andere Konstruktor aus dem Inneren des Körpers Methode aufzurufen. Sie können einen Basiskonstruktor folgendermaßen aufrufen: foo (args): base() wie Sie selbst angegeben haben. Sie können auch einen anderen Konstruktor in derselben Klasse aufrufen: foo (args): this().

Wenn Sie vor dem Aufruf eines Basiskonstruktors etwas tun möchten, scheint die Konstruktion der Basisklasse von einigen externen Dingen abhängig zu sein. Wenn ja, sollten Sie durch Argumente des Basiskonstruktors, nicht indem Sie Eigenschaften der Basisklasse oder etwas Ähnliches setzen

71

Wenn Sie meinen, wenn Sie ctor Verkettung in C# tun können, ist die Antwort ja. The question wurde bereits gefragt.

jedoch aus den Kommentaren scheint, so scheint es, was Sie wirklich ist zu fragen, beabsichtigen ‚Kann ich einen überladenen Konstruktor von innerhalb anderen Konstruktor rufen mit Pre/Post-Processing?‘
Obwohl C# dies nicht die Syntax zu tun haben, können Sie mit einer gemeinsamen Initialisierungsfunktion dies tun könnte (wie Sie in C++ tun würde, was nicht Ctor Verkettungs 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); 
    } 
} 
+0

Dies sollte wahrscheinlich die akzeptierte Antwort sein. – Panzercrisis