2009-09-22 6 views
8

die folgende Klasse Gegeben:In C#, was ist die beste/akzeptierte Art der Konstruktorverkettung?

public class MyClass 
{ 
    private string _param; 

    public MyClass() 
    { 
     _param = string.Empty; 
    } 

    public MyClass (string param) 
    { 
     _param = param; 
    } 
} 

ich auseinander diese Konstrukteuren zwischen zwei Arten Kette zerrissen bin:

Die erste:

public MyClass() : this (string.Empty) 
{ 
} 

public MyClass (string param) 
{ 
    _param = param; 
} 

Die zweite:

public MyClass() 
{ 
    _param = string.Empty; 
} 

public MyClass (string param) : this() 
{ 
    _param = param; 
} 

Also, ist es besser, vom parameterlosen Konstruktor zu ketten oder umgekehrt?

Antwort

13

Mit Ihrem Beispiel würde ich den ersten Weg gehen. Die zweite beseitigt keine Codeverdopplung, die Sie vermutlich vermeiden möchten, da Sie immer noch explizit _param setzen müssen. Der leere this() Aufruf im zweiten Ansatz ist völlig kostenlos.

+0

In der Tat, und es scheint hier der Konsens zu sein. –

4

Ich bevorzuge die erste. Das Verhalten der Konstruktoren wird immer kohärent und vorhersagbar sein, und außerdem wird die Code-Duplizierung reduziert.

3

Kette von pramater weniger pramater,

so von Vermieter param Konstrukteuren Aufruf mit Standard vals, um mehr Parameter

public MyClass() 
{ 
    MyClass(default value here); 
} 

public Myclass(value) 
{ 
    _value = value; 
} 
1

Ich könnte mir vorstellen, dass es von weniger zu mehr, das heißt an die Kette immer besser wieso sollte eine leere Zeichenkette dann eine gegebene Zeichenkette im Konstruktor zugewiesen werden, wenn es sinnvoller ist, den Standard (string.Empty) an den parametrisierten Konstruktor zu übergeben.

0

Wenn Sie hier Ihr Ziel als "Bereitstellung eines Standards, wenn kein Wert angegeben ist" angeben, sollten Sie eindeutig den ersten Ansatz verwenden.

Die allgemeine Regel wäre dann: Kette vom am wenigsten spezifischen Konstruktor zum am meisten spezifischen.

1

Ich bevorzuge die erste auch. Genau wie in einer komplexen abgeleiteten Klasse, die von einer einfachen Basisklasse erbt, möchten Sie, dass der "komplexe" Konstruktor auf der Funktionalität der "grundlegenden" basiert.

1

Das zweite Beispiel in Ihrem Fall ist wirklich nicht sinnvoll, da Sie die Zuordnung des Klassenmembers duplizieren (wenn Sie MyClass (string param) Konstruktor verwenden).

Der zweite Ansatz ist sinnvoller, wenn verkettete Konstruktoren "Funktionalität hinzufügen".

Beispiel:

public MyClass() 
{ 
    _param0 = string.Empty; 
} 

public MyClass (string param1) : this() 
{ 
    _param1 = param1; 
} 

public MyClass (string param1, string param2) : this (param1) 
{ 
    _param2 = param2; 
} 

In Ihrem speziellen Fall, das erste Beispiel ist natürlich viel besser geeignet, da Sie nur eine Zuordnung zu dem gleichen Elemente haben.