2009-09-22 15 views
8

Biorąc pod uwagę następujące klasy:W języku C#, jaki jest najlepszy/akceptowany sposób wykonywania łańcuchów konstruktora?

public class MyClass 
{ 
    private string _param; 

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

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

Jestem rozdarty między dwa sposoby łańcucha te konstruktorów:

Pierwszy:

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

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

drugi:

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

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

Czy lepiej jest łączyć z konstruktorem bez parametrów lub na odwrót?

Odpowiedz

13

Na tym przykładzie poszedłbym pierwszą drogą. Drugi tak naprawdę nie eliminuje powielania kodu, którego prawdopodobnie unikasz, ponieważ nadal musisz jawnie ustawić _param. Puste wywołanie this() w drugim podejściu jest całkowicie nieuzasadnione.

+0

Rzeczywiście, i wydaje się, że jest to konsensus. –

4

Wolę pierwszy. Zachowanie konstruktorów będzie zawsze spójne i przewidywalne w ten sposób, a ponadto ograniczy duplikowanie kodu.

3

Chain od pramater mniej pramater,

więc dzwonisz leasingodawców konstruktorów param z domyślnych odstępach do większej liczby parametrów

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

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

bym sobie wyobrazić, że to zawsze lepiej do łańcucha z mniejszego na większy, to znaczy po co przypisywać pusty ciąg do danego ciągu w konstruktorze, gdy bardziej sensowne jest przekazanie wartości domyślnej (string.Empty) do sparametryzowanego konstruktora.

0

Jeśli tutaj określisz swój cel jako "podający wartość domyślną, gdy nie zostanie podana żadna wartość", powinieneś wyraźnie zastosować pierwsze podejście.

Ogólna zasada brzmi: łańcuch od najmniej specyficznego konstruktora do najbardziej specyficznego.

1

Ja też wolę pierwszy. Podobnie jak w złożonej klasie pochodnej dziedziczącej po prostej klasie bazowej, chcesz, aby "złożony" konstruktor opierał się na funkcjonalności "podstawowego".

1

Drugi przykład w twoim przypadku naprawdę nie ma sensu, ponieważ duplikujesz przypisanie członka klasy (jeśli używasz konstruktora MyClass (string param)).

Drugie podejście jest bardziej użyteczne, jeśli konstruktorzy łańcuchowe są "dodawaniem funkcjonalności".

Przykład:

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

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

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

W danym przypadku, pierwszy przykład jest oczywiście znacznie bardziej odpowiedni, ponieważ masz tylko jedno zadanie do tego samego elementu.

Powiązane problemy