Tôi vừa tìm thấy mã lạ trong mã Jeffrey Richter (CLR qua C# 4.0, trang 257) và có hiểu lầm tại sao nó hoạt động như vậy.nhận và thiết lập sự hiểu lầm trong khởi tạo: Jeffrey Richter, CLR qua C#
public sealed class Classroom
{
private List<String> m_students = new List<String>();
public List<String> Students { get { return m_students; } }
public Classroom() { }
}
class Program
{
static void Main(string[] args)
{
Classroom classroom = new Classroom {
Students = { "Jeff", "Kristin" }
};
foreach (var student in classroom.Students)
Console.WriteLine(student);
}
}
Kết quả:
Jeff
Kristin
Như bạn có thể thấy, chúng ta có một tài sản accessor có tên là 'Học sinh', mà chỉ có getter (! Không setter), nhưng trong chức năng 'Main', khi chúng tôi muốn khởi tạo biến 'lớp học', chúng tôi khởi tạo trường 'Học sinh' của loại 'Lớp học':
Classroom classroom = new Classroom {
Students = { "Jeff", "Kristin" }
};
Tôi luôn nghĩ rằng khi một biến trong 'bên trái' của biểu thức (int i = 1), sau đó trình biên dịch nên truy cập vào hàm setter, và khi trong 'right-side' (int x = i + 2) để hàm getter.
Tại sao mã của Jeffrey lại có hành vi thú vị như vậy (có thể nó chỉ dành cho tôi? Xin lỗi nếu có).
Huy hiệu cho câu trả lời nhanh chóng trong việc cải thiện chỉnh sửa ở đâu? – Michael
Đáng chú ý rằng 'Học sinh = danh sách mới()' sẽ đưa ra một lỗi biên dịch thời gian là một, trên khuôn mặt của nó, ban đầu có thể mong đợi trong trường hợp khác này? –
Kiến thức này đã đáp ứng hạn ngạch "Chỉnh sửa C# thực tế trong ngày" của tôi. – Chris