2013-02-13 26 views
8

tôi không thể hiểu sự khác biệt giữa một đơn giản trầnKhi nào và tại sao tôi nên sử dụng ClassName: this (null)?

Public ClassName() {} 

Public ClassName() : this(null) {} 

Tôi biết tôi có thể sử dụng nó chỉ khi tôi có một ctor +1 quá tải, nhưng tôi không thể hiểu được lợi thế của defining the parameterless constructor theo cách này.

+1

Xem: [C# Constructor Chaining] (http://stackoverflow.com/q/1814953/) –

+0

Nó dọn sạch API một chút và giảm trùng lặp mã bằng cách sử dụng lại hàm tạo tham số đơn ngụ ý. – JosephHirn

Trả lời

10

Điều này cho phép hàm tạo duy nhất-tham số có tất cả logic, vì vậy nó không được lặp lại.

public ClassName() : this(null) {} 

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

Tôi hy vọng nó là rõ ràng rằng "logic" và "logic thậm chí nhiều hơn" sẽ cần phải được lặp đi lặp lại trong các nhà xây dựng parameterless nếu không muốn nói cho this(null).

+0

Cảm ơn bạn đã trả lời. Bạn có ý nghĩa gì với "có tất cả logic" chính xác? – Sergio

+1

@Daedalus Giả sử bạn cần thực hiện một số công việc thiết lập trong hàm tạo không phụ thuộc vào tất cả tham số. Thay vì sao chép và dán mã hai lần, bạn chỉ có thể có hàm tạo paramtetrless gọi hàm tạo thứ 2 và đặt công việc thiết lập một lần ở đó. –

+1

@Daedalus Thay vì lặp lại mã trong cả hai hàm tạo với một thay đổi nhỏ cho sự tồn tại của một tham số, bạn đặt tất cả mã trong một hàm tạo và có một mã khác gọi mã với tất cả mã và một số giá trị mặc định. – Servy

3

Một trường hợp rất hữu ích là các tình huống như WinForms, nơi nhà thiết kế yêu cầu một hàm tạo không có tham số nhưng bạn muốn biểu mẫu yêu cầu một hàm tạo.

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

Ok nhưng nếu tôi bỏ qua điều này (null) không có gì thay đổi, ở đôi mắt của tôi ... Tôi đang thiếu gì? – Sergio

+0

@Daedalus Không có gì, đây không phải là một ví dụ tốt. – Servy

+2

Không, nếu bạn bỏ qua 'this (null)', nhà thiết kế sẽ không bao giờ gọi 'InitializeComponent()' –

1

Có mẫu gọi là Constructor injection. Mẫu này chủ yếu là hữu ích cho việc kiểm tra đơn vị và chia sẻ logic. Dưới đây là ví dụ

public class SomeClass 
{ 
    private ISomeInterface _someInterface; 
    public SomeClass() : this (null){} //here mostly we pass concrete implementation 
    //of the interface like this(new SomeImplementation()) 

    public SomeClass(ISomeInterface someInterface) 
    { 
     _someInterface = someInterface;  
     //Do other logics here 
    } 
} 

Như bạn thấy ở đây, kiểm tra đơn vị sẽ dễ dàng bằng cách thực hiện giả mạo. Ngoài ra, logic được chia sẻ (DRY). Và Thực hiện tất cả logic bên trong hàm tạo có số tham số cao nhất

Nhưng trong trường hợp của bạn, null được truyền, do đó, đó là ngữ cảnh. Tôi phải biết ngữ cảnh của bạn là gì.

+0

Constructor Injection được sử dụng với Dependency Injection. Câu hỏi và câu trả lời của bạn là cả về Constructor Chaining. –

Các vấn đề liên quan