2012-01-31 38 views
27

Tôi có một loại:Cách khởi tạo danh sách bằng hàm tạo?

public class Human 
{ 
    public int Id { get; set; } 
    public string Address { get; set; } 
    public string Name { get; set; } 
    public List<ContactNumber> ContactNumbers { get; set; } 

    public Human(int id) 
    { 
     Id = id; 
    } 

    public Human(int id, string address, string name, 
       List<ContactNumber> contactNumbers) : 
     this(id) 
    { 
     Address = address; 
     Name = name; 
     ContactNumbers = contactNumbers; 
    }   
} 

hãy hướng dẫn cho tôi là một trong những thông lệ tốt nhất để sử dụng constructor với cho danh sách khởi tạo? Cách khởi tạo danh sách bằng hàm tạo?

Edit:

hãy hướng dẫn cho tôi là một trong những thông lệ tốt nhất để sử dụng constructor với cho danh sách khởi tạo? Cách gán giá trị vào danh sách bằng cách sử dụng hàm tạo, vì vậy nếu không có giá trị nào được chuyển qua mặc định sẽ được sử dụng?

Cảm ơn

Trả lời

46

Sử dụng một initializer bộ sưu tập

Từ C# 3, bạn có thể sử dụng initializers bộ sưu tập để xây dựng một danh sách và đưa vào đó sử dụng một biểu thức duy nhất. Ví dụ sau đây xây dựng một con người và ContactNumbers của nó:

var human = new Human(1, "Address", "Name") { 
    ContactNumbers = new List<ContactNumber>() { 
     new ContactNumber(1), 
     new ContactNumber(2), 
     new ContactNumber(3) 
    } 
} 

Chuyên các Human constructor

Bạn có thể thay đổi các nhà xây dựng của lớp Human cung cấp một cách để cư ContactNumbers tài sản:

public class Human 
{ 
    public Human(int id, string address, string name, IEnumerable<ContactNumber> contactNumbers) : this(id, address, name) 
    { 
     ContactNumbers = new List<ContactNumber>(contactNumbers); 
    } 

    public Human(int id, string address, string name, params ContactNumber[] contactNumbers) : this(id, address, name) 
    { 
     ContactNumbers = new List<ContactNumber>(contactNumbers); 
    } 
} 

// Using the first constructor: 
List<ContactNumber> numbers = List<ContactNumber>() { 
    new ContactNumber(1), 
    new ContactNumber(2), 
    new ContactNumber(3) 
}; 

var human = new Human(1, "Address", "Name", numbers); 

// Using the second constructor: 
var human = new Human(1, "Address", "Name", 
    new ContactNumber(1), 
    new ContactNumber(2), 
    new ContactNumber(3) 
); 

Dòng dưới cùng

Cách thay thế nào là phương pháp hay nhất? Hoặc ít nhất là một thực hành tốt? Bạn đánh giá nó! IMO, cách tốt nhất là viết chương trình càng rõ ràng càng tốt cho bất kỳ ai phải đọc nó. Sử dụng bộ khởi tạo bộ sưu tập là người chiến thắng cho tôi, trong trường hợp này. Với mã ít hơn nhiều, nó có thể làm hầu như những thứ tương tự như các lựa chọn thay thế - ít nhất, các lựa chọn thay thế mà tôi đã cho ...

+0

cảm ơn Humberto, plz xem chỉnh sửa của tôi – haansi

3
ContactNumbers = new List<ContactNumber>(); 

Nếu bạn muốn nó được thông qua vào, chỉ cần mang

public Human(List<ContactNumber> numbers) 
{ 
ContactNumbers = numbers; 
} 
+0

Cảm ơn @ eouw0o83hf, Tôi xin lỗi vì đã không giải thích đầy đủ. Tôi muốn chuyển số cho danh sách bằng cách sử dụng hàm tạo. Vui lòng cũng nói là nó là một cách tốt để vượt qua các giá trị để danh sách giống như chúng tôi vượt qua các giá trị khác? – haansi

+0

Bạn đang tìm kiếm từ khóa [params] (http://msdn.microsoft.com/en-us/library/w5zay9db.aspx)? – TrueWill

+0

Không TrueWill, tôi muốn gán giá trị vào danh sách bằng cách sử dụng hàm tạo. Ngoài ra, hãy hướng dẫn cách xử lý nếu không có giá trị nào được chỉ định (điều gì sẽ là mặc định)? Nó là một cách tiêu chuẩn? – haansi

2

Bạn có thể khởi tạo nó giống như danh sách bất kỳ:

public List<ContactNumber> ContactNumbers { get; set; } 

public Human(int id) 
{ 
    Id = id; 
    ContactNumbers = new List<ContactNumber>(); 
} 

public Human(int id, string address, string name) :this(id) 
{ 
    Address = address; 
    Name = name; 
    // no need to initialize the list here since you're 
    // already calling the single parameter constructor 
}  

Tuy nhiên, tôi thậm chí sẽ đi một bước xa hơn và làm cho setter riêng vì bạn thường không cần phải thiết lập danh sách, nhưng chỉ cần ac cess/sửa đổi nội dung của nó:

public List<ContactNumber> ContactNumbers { get; private set; } 
+0

Cảm ơn @Lirik, Vui lòng hướng dẫn cách chuyển các giá trị vào danh sách từ constrcot? cũng hướng dẫn là nó tiêu chuẩn cách để sử dụng constroctor để vượt qua các giá trị cho một tài sản đó là một danh sách về cơ bản? – haansi

1

Nói chung không để lộ thanh toán cho thuộc tính thu nợ. Ngoài ra, bạn có thể muốn sao chép các phần tử của danh sách được chuyển (như được hiển thị bên dưới). Nếu không, các thay đổi đối với danh sách gốc sẽ ảnh hưởng đến cá thể Con người.

public class Human 
{ 
    public Human() 
    { 
    } 

    public Human(IEnumerable<ContactNumber> contactNumbers) 
    { 
     if (contactNumbers == null) 
     { 
      throw new ArgumentNullException("contactNumbers"); 
     } 

     _contactNumbers.AddRange(contactNumbers); 
    } 

    public IEnumerable<ContactNumber> ContactNumbers 
    { 
     get { return _contactNumbers; } 
    } 

    private readonly List<ContactNumber> _contactNumbers = new List<ContactNumber>(); 
} 

Một tùy chọn khác là sử dụng hàm tạo danh sách thu thập và xóa trình khởi tạo trường.

+0

Cảm ơn @TrueWill, chúng ta có thể không điền vào một danh sách và chuyển nó cho hàm tạo giống như chúng ta truyền các giá trị khác thông qua hàm tạo và nếu không có giá trị thì gán một giá trị mặc định? làm thế nào nó sẽ được thực hiện? Đó có phải là cách hay để làm như vậy không? – haansi

+1

Nó phụ thuộc. Bạn đang chuyển ** tài liệu tham khảo **. Bạn có muốn các địa chỉ liên lạc của con người thay đổi khi danh sách liên lạc ban đầu được thay đổi không? Nếu bạn muốn một danh sách mặc định, tôi thường thêm một hàm tạo mặc định vào Human để tạo một danh sách rỗng. Tránh tham chiếu null bất cứ khi nào có thể. Cũng tránh các danh sách rỗng đặc biệt. – TrueWill

5

Bạn đang tìm kiếm điều này?

ContactNumbers = new List<ContactNumber>(){ new ContactNumber("555-5555"), 
              new ContactNumber("555-1234"), 
              new ContactNumber("555-5678") }; 
+0

cảm ơn Joce, vui lòng xem chỉnh sửa của tôi. – haansi

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