tạo tham số đối tượng trong {}?


14

Tôi đang cố gắng giải mã một đoạn mã từ một cuốn sách:

List<Person> people = new List<Person>()
{
new Person {FirstName="Homer",LastName="Simpson",Age=47},
new Person {FirstName="Marge",LastName="Simpson",Age=45}
};

Person chỉ là một lớp đơn giản mà họ tạo ra, với một loạt các trường: Tên, Họ, v.v ...

Điều tôi không hiểu là, chúng ta không gửi tham số cho người xây dựng Person trong dấu ngoặc không cong? Tôi đã thử sao chép mã này, nhưng nó dường như không bay, bất kỳ người nhận nào?

Cảm ơn cho đầu vào.



1
"Tôi đã thử sao chép mã này, nhưng dường như nó không bay được" <- bạn cần sử dụng C # 3 (VS 2008) hoặc sau đó để cú pháp này khả dụng.
AakashM

Hãy nhận biết sự khác biệt giữa hai khái niệm: Khởi tạo đối tượng và Dân số đối tượng. Nói chung, bạn làm khởi tạo trong hàm tạo. Phương pháp ví dụ của bạn được sử dụng tốt nhất cho dân số không phải để khởi tạo.
NoChance

Câu trả lời:


27

C # cho phép bạn chỉ định các tham số thuộc tính trong dấu ngoặc nhọn khi đối tượng được khởi tạo. Điều này cho phép bạn chọn và chọn mục nào để khởi tạo và mục nào để mặc định.

Mặt khác, một hàm tạo, chạy một khối mã với một bộ tham số cố định. Vì vậy, để có được hiệu ứng tương tự, bạn phải tạo nhiều hàm tạo với tất cả các kết hợp thuộc tính khác nhau mà bạn có thể muốn khởi tạo, điều này có thể rất tẻ nhạt.

var x = new Person {FirstName="Homer",LastName="Simpson",Age=47}; 

hoàn toàn tương đương với điều này:

var x = new Person();
x.FirstName="Homer";
x.LastName="Simpson";
x.Age=47;

Ngoại trừ việc nó ngắn hơn và dễ nhìn hơn trên mắt.

Nó cũng cho phép các cấu trúc như bạn thể hiện trong câu hỏi của bạn, sẽ rất tẻ nhạt nếu bạn phải tạo các biến tạm thời và khởi tạo chúng như tôi đã làm ở đây trước khi thêm chúng vào danh sách. (Đó là cách bạn đã từng phải làm điều đó.) Tất cả mà không yêu cầu một nhà xây dựng được xác định rõ ràng có danh sách các tham số mong muốn của bạn, có thể có hoặc không có sẵn.

Ngoài ra, lưu ý rằng trong khi một nhà xây dựng có thể khởi tạo các thuộc tính với một setter tin, kỹ thuật này (như nên được rõ ràng từ các ví dụ được cung cấp) sẽ chỉ làm việc nếu bạn có một setter nào cho bất động sản. Cũng lưu ý rằng ví dụ rút gọn của tôi được gọi ngầm là hàm tạo mặc định (không tham số), do đó sẽ phải có mặt.


Có thể đáng để thêm rằng do điều này, các thuộc tính được khởi tạo trong dấu ngoặc nhọn phải được đặt ở chế độ công khai.
Yam Marcovic

@YamMarcovic ah. Đúng. Lưu ý thêm vào hiệu ứng đó.
tylerl

2
Ah, tôi đã giác ngộ, giải thích tuyệt vời.
Thực tế chức năng

2
Để có được hiệu ứng tương tự với một hàm tạo, bạn có thể đặt tất cả các tham số của nó. Sau đó, bạn có thể làm một cái gì đó như new Person(lastName: "Simpson"), bỏ qua firstNameagecác tham số.
Svick

Điều này không giải quyết lý do tại sao bạn không thể chuyển chúng cho nhà xây dựng, tức làvar x = new Person("Homer", "Simpson", 47);
rayray
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.