2013-02-13 1 views
8

Ich verstehe nicht den Unterschied zwischen einem einfachen nacktenWann und warum sollte ich ClassName verwenden: this (null)?

Public ClassName() {} 

und

Public ClassName() : this(null) {} 

Ich weiß, dass ich es nur, wenn ich überlastet Ctor verwenden kann einen +1, aber ich kann das nicht verstehen Vorteile von defining the parameterless constructor auf diese Weise.

+1

Siehe: [C# -Konstruktorverkettung] (http://stackoverflow.com/q/1814953/) –

+0

Es räumt die API ein wenig auf und reduziert die Codeverdopplung durch Wiederverwendung des implizierten Einzelparameterkonstruktors. – JosephHirn

Antwort

10

Dies ermöglicht dem Einzelparam-Konstruktor, alle Logik zu haben, so dass es nicht wiederholt wird.

public ClassName() : this(null) {} 

public ClassName(string s) 
{ 
    // logic (code) 
    if (s != null) { 
     // more logic 
    } 
    // Even more logic 
} 

Ich hoffe, es ist klar, dass die „Logik“ und „mehr Logik auch“ gebraucht hätten in dem parameterlosen Konstruktor, wenn nicht für die this(null) wiederholt werden.

+0

Vielen Dank für Ihre Antwort. Was meinst du mit "genau die Logik haben"? – Sergio

+1

@Daedalus Nehmen wir an, Sie müssen einige Setup-Arbeiten im Konstruktor durchführen, die überhaupt nicht von dem Parameter abhängen. Anstatt den Code zweimal zu kopieren und einzufügen, können Sie den paramtetress-Konstruktor einfach den zweiten Konstruktor aufrufen lassen und die Setup-Arbeit einmal dort ablegen. –

+1

@Daedalus Anstatt den Code in beiden Konstruktoren mit einer kleinen Änderung für die Existenz eines Parameters zu wiederholen, setzen Sie den gesamten Code in einen Konstruktor und rufen den anderen Code mit dem gesamten Code und einigen Standardwerten auf. – Servy

3

Ein sehr nützlicher Fall sind Situationen wie WinForms, wo der Designer einen prameterless Konstruktor benötigt, aber Sie möchten, dass Ihr Formular einen Konstruktor benötigt.

public partial SomeForm : Form 
{ 
    private SomeForm() : this(null) 
    { 
    } 

    public SomeForm(SomeClass initData) 
    { 
     InitializeComponent(); 

     //Do some work here that does not rely on initData.   

     if(initData != null) 
     { 
      //do somtehing with initData, this section would be skipped over by the winforms designer. 
     } 
    } 
} 
+0

Ok, aber wenn ich das weglassen (null) nichts ändert, in meinen Augen ... Was vermisse ich? – Sergio

+0

@Daedalus Nichts, das ist kein gutes Beispiel. – Servy

+2

Nein, wenn Sie 'this (null)' weglassen, ruft der Designer niemals 'InitializeComponent()' –

1

Es gibt ein Muster namens Constructor injection. Dieses Muster ist hauptsächlich nützlich für das Komponententesten und das Teilen der Logik. Hier ist ein Beispiel

public class SomeClass 
{ 
    private ISomeInterface _someInterface; 
    public SomeClass() : this (null){} //here mostly we pass concrete implementation 
    //of the interface like this(new SomeImplementation()) 

    public SomeClass(ISomeInterface someInterface) 
    { 
     _someInterface = someInterface;  
     //Do other logics here 
    } 
} 

Wie Sie hier sehen, werden Komponententests leicht durch die Weitergabe gefälschte Implementierung sein. Zusätzlich wird die Logik geteilt (DRY). Und machen Sie die ganze Logik innerhalb des Konstruktors, der die höchste Anzahl an Parametern annimmt

Aber in Ihrem Fall wird Null übergeben, so dass ein Kontext basiert. Ich muss wissen, was dein Kontext ist.

+0

Constructor Injection wird mit Dependency Injection verwendet. Die Frage und Ihre Antwort beziehen sich beide auf die Konstruktorverkettung. –