2013-02-13 13 views
8

i arasındaki farkı anlayamıyorum basit çıplakNe zaman ve neden ClassName kullanmalıyım: Bu (boş)?

Public ClassName() {} 

ve

Public ClassName() : this(null) {} 

ben i +1 aşırı ctor sahipseniz kullanabilirsiniz biliyorum ama anlayamıyorum defining the parameterless constructor'un avantajları bu şekilde.

+1

Bakın: [C# Oluşturucu Zincirleme] (http://stackoverflow.com/q/1814953/) –

+0

API'yi biraz temizler ve belirtilen tek parametreli kurucuyu yeniden kullanarak kod çoğaltmayı azaltır. – JosephHirn

cevap

10

Bu, tek param yapıcının tüm mantığa sahip olmasına izin verir, böylece tekrarlanmaz.

public ClassName() : this(null) {} 

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

Ben "mantık" ve "daha mantık" değilse this(null) için parametresiz yapıcı içinde tekrarlanması vermesi gerekirdi olduğu açıktır umuyoruz.

+0

Cevap verdiğiniz için teşekkür ederiz. Tam olarak "tüm mantığa sahip olmak" ile ne demek istiyorsun? – Sergio

+1

@Daedalus Yapıcının tümünde parametreye bağlı olmayan bir kurulum çalışması yapmanız gerektiğini varsayalım. Kodu kopyalayıp iki kez yapıştırmak yerine, paramtetrless kurucunun 2. kurucuyu çağırmasını ve kurulum işini orada bir kez yapmasını sağlayabilirsiniz. –

+1

@Daedalus Her iki kurucudaki kodu tek bir parametrenin varlığı için küçük bir değişiklikle tekrarlamak yerine, tüm kodu bir kurucuya yerleştirirsiniz ve diğerini kodun tamamını ve bazı varsayılan değerleri içeren birini çağırırsınız. – Servy

3

Çok kullanışlı olan bir durum, tasarımcıya prameterless bir kurucu gerektiren WinForms gibi durumlardır ancak formunuzun bir kurucu gerektirmesini istiyorsanız.

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

cevabını güncelledim Tamam ama eğer (boş) hiçbir şey değişmezse, gözlerimde ... Neler eksik? – Sergio

+0

@Daedalus Hiçbir şey, bu iyi bir örnek değil. – Servy

+2

Hayır, bu (boş) öğesini atlarsanız, tasarımcı hiçbir zaman "InitializeComponent()" –

1

Constructor injection adlı bir model var. Bu model esas olarak birim testi ve mantığı paylaşmada kullanışlıdır. İşte burada bir örnek olarak, sahte uygulama yapılarak birim testler kolay olacaktır. Ayrıca mantık paylaşılıyor (DRY). Ve

parametrelerinin en yüksek sayısını alan yapıcıdaki tüm mantığı yapın. Ancak sizin durumunuzda, null geçiyor, bu da bir bağlam temelli. Bağlamın ne olduğunu bilmek zorundayım.

+0

Oluşturucu Enjeksiyon, Bağımlılık Enjeksiyonu ile kullanılır. Soru ve cevabınız Constructor Chaining hakkında. –

İlgili konular