2012-08-22 6 views
5

Lütfen aşağıdan yorumda yer alan soruya bakın.Bir temel kurucuya zincirleme yaparken, bir aşırı yüklenmede başlatma kodunu nasıl yeniden kullanabilirim

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; 
    } 
} 

I temel kurucu yeniden ve başlatma kodu en aza, alternatif uygulamaları da dikkate açığım. _customField'ı okumaya devam etmek isterim, eğer ayrı bir başlatma yöntemi çıkarsam mümkün olmaz.

cevap

3

Bunu ayrı bir yöntem olarak faktörü ve her iki kurucudan bu yöntemi çağırın.

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

Derleme hatası: Salt okunur bir alan atanamaz (bir yapıcı veya değişken başlatıcı dışında). Sorumumda da belirtildiği gibi, alanı düzenli olarak tutmak istiyorum. –

+0

@ZaidMasud Hayır, derleme hatası yok. 'Init' içinde' _customField', alana atıfta bulunan, ancak alanın kendisine ait olmayan bir 'out' parametresidir. – hvd

+0

Ahh ... şimdi düzenle bakın. Parametreyi hem dışarı hem de dışarıda değil olarak görmek için ilginç sözdizimi. Bunu test etmek gerekiyor. –

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

Teşekkürler, ancak bu, temel sınıfın boş dizeyi varsayılan olarak kullandığını varsayar. Bu, Özel Durum sınıfı için yeterince yakın olabilir, ancak genel olarak doğru olması garanti edilemez. Genel CustomException (string customField) kurucusu için, temel kurucuya ideal olarak çağrı yapılmamalıdır. –

İlgili konular