2013-01-20 32 views
5

Đôi khi một danh sách initializer được quy định sau tên lớp mà không sử dụng() điều hành:C# Trình khởi tạo danh sách - khi nào sử dụng toán tử() sau tên lớp?

Cat cat = new Cat { Age = 10, Name = "Fluffy" } 

lần khác nó được xác định sau khi) điều hành (:

List<Cat> cats = new List<Cat> 
    { 
     new Cat(){ Name = "Sylvester", Age=8 } 
    } 

Tôi giả định sự khác biệt là vì ở đây Cat mới() nằm trong danh sách. Nhưng tôi vẫn không hiểu tại sao nó lại khác. Vậy tại sao sự khác biệt, và khi nào nên sử dụng cú pháp nào?

Cảm ơn.

+0

bản sao có thể có của [Tại sao dấu ngoặc đơn khởi tạo đối tượng khởi tạo đối tượng C# 3.0 tùy chọn?] (Http://stackoverflow.com/questions/3661025/why-are-c-sharp-3-0-object-initializer-constructor-parentheses -optional) – CharlesB

Trả lời

6

Khi bạn sử dụng danh sách trình khởi tạo, bạn có thể bỏ qua dấu() khi sử dụng hàm tạo tham số. Nó không quan trọng với Cát mới() là bên trong danh sách hay không.

6

Bạn phải chỉ định () khi không có hàm tạo mặc định (không tham số) - khi bạn phải cung cấp thông số.

Khi một lớp có hàm khởi tạo mặc định (hoặc không có tham số), bạn luôn có thể bỏ qua () khi sử dụng trình khởi tạo. Trình biên dịch thực hiện phép thuật cho bạn và bạn có thể nghĩ về những thứ như - trình biên dịch chèn chúng cho bạn.

+0

Nếu không có hàm tạo mặc định() sẽ không hoạt động? Ví dụ tôi đưa ra ở trên là từ MSDN, và ở đó lớp Cat không có bất kỳ hàm tạo nào, có nghĩa là có một lớp mặc định. –

+0

Câu trả lời này không đúng như hiện tại. Bạn không thể luôn bỏ qua(). "Mèo mới;" Sẽ không làm việc. Bạn có thể bỏ qua nó khi bạn sử dụng danh sách khởi tạo. – user1908061

+0

@YechielLabunskiy - Không, nó sẽ không hoạt động. Constructor mặc định là một tạo ra khi bạn _don't_ chỉ định một constructor và nó là một tham số một. – Oded

0

Không có sự khác biệt thực sự đối với hai bạn quyết định sử dụng. So sánh hai trường hợp này Cat:

var catA = new Cat(); // traditional constructor 
catA.Name = "Mittens"; // set property 

var catB = new Cat { Name = "Not Mittens" }; // all in one initializer 

Chúng giống nhau về chức năng, chỉ cần ký hiệu phím tắt. Cách đầu tiên là cách truyền thống, mà hầu hết các ngôn ngữ hướng đối tượng hướng đối tượng (OO) tạo đối tượng bằng cách sử dụng phương thức khởi tạo . C# gần đây đã thêm phương pháp mới này để tạo các đối tượng và thiết lập các thuộc tính để làm cho mã sạch hơn.

Thậm chí nếu lớp học của bạn không có hàm tạo tham số (new()), bạn vẫn có thể sử dụng số khởi tạo {...}.

Hãy xem xét điều này:

var dogA = new Dog("Fido"); 
var dogA.Age = 12; 

var dogB = new Dog("Not Fido") { Age = 7 }; 

Thậm chí nếu các thông số được yêu cầu trong constructor, bạn vẫn có thể sử dụng phong cách này khởi tạo miễn là bạn cung cấp cho họ.

+0

Chúng không hoàn toàn giống nhau và có sự khác biệt. Đọc http://haacked.com/archive/2013/01/11/hidden-pitfalls-with-object-initializers.aspx để biết thêm thông tin. :) – user1908061

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