2009-09-22 38 views
8

Với lớp sau đây:Trong C#, cách tốt nhất/được chấp nhận để thực hiện chuỗi hàm tạo là gì?

public class MyClass 
{ 
    private string _param; 

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

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

Tôi xé lẻ giữa hai cách để chuỗi những cấu trúc:

Đầu tiên một:

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

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

Thứ hai:

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

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

Vì vậy, nó là tốt hơn để chuỗi từ constructor parameterless hoặc cách khác xung quanh?

Trả lời

13

Với ví dụ của bạn, tôi sẽ đi theo cách đầu tiên. Thứ hai không thực sự loại bỏ bất kỳ sự sao chép mã nào mà bạn có lẽ đang cố tránh, vì bạn vẫn phải đặt rõ ràng _param. Các cuộc gọi this() trống trong phương pháp thứ hai là hoàn toàn vô cớ.

+0

Thật vậy, và dường như đây là sự đồng thuận ở đây. –

4

Tôi thích mục đầu tiên. Các hành vi của các nhà xây dựng sẽ luôn luôn được mạch lạc và dự đoán theo cách đó, cộng với nó làm giảm trùng lặp mã.

3

Chain từ pramater ít hơn để pramater,

để gọi từ nhà xây dựng param bên cho thuê với Vals mặc định để nhiều tham số

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

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

Tôi tưởng tượng rằng nó luôn luôn tốt hơn để chuỗi từ ít đến nhiều hơn, tức là tại sao gán một chuỗi rỗng sau đó một chuỗi đã cho trong hàm tạo khi nó có ý nghĩa hơn để truyền giá trị mặc định (string.Empty) cho hàm tạo tham số.

0

Nếu bạn nêu mục tiêu của mình ở đây là "cung cấp mặc định khi không có giá trị nào được chỉ định", thì bạn nên sử dụng rõ ràng phương pháp đầu tiên.

Quy tắc chung sau đó sẽ là: chuỗi từ nhà xây dựng ít cụ thể nhất đến cụ thể nhất.

1

Tôi thích người đầu tiên nữa. Cũng giống như trong một lớp dẫn xuất phức tạp kế thừa từ một lớp cơ sở đơn giản, bạn muốn hàm tạo "phức tạp" xây dựng trên chức năng của cơ bản "cơ bản".

1

Ví dụ thứ hai trong trường hợp của bạn thực sự không có ý nghĩa, vì bạn đã phân công trùng lặp thành viên lớp học (nếu bạn sử dụng MyClass (string param) hàm tạo).

Cách tiếp cận thứ hai hữu ích hơn nếu các nhà xây dựng xích là "thêm chức năng".

Ví dụ:

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

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

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

Trong trường hợp cụ thể của bạn, ví dụ đầu tiên rõ ràng là nhiều hơn nữa thích hợp, vì bạn chỉ có một nhiệm vụ cho các thành viên cùng.

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