2012-08-22 13 views
5

Zobacz pytanie osadzone w komentarzu poniżej.Podczas łączenia się z konstruktorem podstawowym, w jaki sposób mogę ponownie użyć kodu inicjalizacyjnego w przeciążeniu

public class CustomException : Exception 
{ 
    private readonly string _customField; 

    public CustomException(string customField, string message) 
     : base(message) 
    { 
     // What's the best way to reuse the customField initialization code in the 
     // overloaded constructor? Something like this(customField) 
    } 

    public CustomException(string customField) 
    { 
     _customField = customField; 
    } 
} 

Jestem otwarta na rozważenie alternatywnych implementacji, które można ponownie użyć konstruktora bazowy i minimalizują kod inicjalizacji. Chciałbym, aby _customField był readonly, co nie jest możliwe, jeśli wyodrębnię osobną metodę inicjowania.

Odpowiedz

3

Wyróżnij go w osobnej metodzie i wywołaj tę metodę z obu konstruktorów.

public class CustomException : Exception 
{ 
    private readonly string _customField; 

    public CustomException(string customField, string message) 
     : base(message) 
    { 
     Init(out _customField, customField); 
    } 

    public CustomException(string customField) 
     : base() 
    { 
     Init(out _customField, customField); 
    } 

    private Init(out string _customField, string customField) 
    { 
     _customField = customField; 
    } 
} 
+0

Błąd kompilacji: nie można przypisać do pola tylko do odczytu (z wyjątkiem konstruktora lub inicjalizatora zmiennych). Jak wspomniano w moim pytaniu, chciałbym zachować pole tylko do odczytu. –

+0

@ ZaidMasud Nie, błąd kompilacji. W 'Init'' _customField' jest parametrem 'out', który odnosi się do pola, ale nie do samego pola. – hvd

+0

Ahh ... zobacz edycję teraz. Interesująca składnia, aby zobaczyć parametr zarówno jako out, jak i out. Musisz to przetestować. –

7
public CustomException(string customField) : this(customField,"") 
{ 
} 
+2

Dzięki, ale zakładamy, że klasa bazowa używa domyślnie pustego ciągu. Może to być wystarczająco blisko klasy Wyjątek, ale nie ma gwarancji, że jest prawdziwe w ogóle. Dla publicznego konstruktora CustomException (string customField) nie powinno być w ogóle idealnie wywoływane do konstruktora podstawowego. –

Powiązane problemy