Đây là một C# 6 tính năng mới, "Getter chỉ tự động tính", còn được gọi là "Initializers Auto-Bất động sản Read-Only Properties" như đã thảo luận trong MSDN magazine article 'C# : The New and Improved C# 6.0' by Mark Michaelis này và trong C# 6.0 draft Language Specification.
Chỉ có thể truy cập bộ chỉ mục của trường chỉ đọc trong hàm tạo, trong tất cả các trường hợp khác, trường này vẫn chỉ đọc và hoạt động như trước.
Đây là cú pháp tiện lợi để giảm số lượng mã bạn cần nhập và loại bỏ nhu cầu khai báo rõ ràng biến số mô-đun riêng để giữ giá trị.
Tính năng này được xem là quan trọng vì việc giới thiệu Thuộc tính tự động trong C# 3, các thuộc tính có thể thay đổi (những người có bộ thu thập và thiết lập) đã nhanh hơn viết so với những người không có người thay đổi. , có nghĩa là mọi người đã bị cám dỗ để sử dụng các thuộc tính có thể thay đổi để tránh phải nhập mã cho trường sao lưu thường được yêu cầu cho thuộc tính chỉ đọc. Có nhiều cuộc thảo luận về các thuộc tính được Tự động triển khai trong các relevant section of the Microsoft C# Programming Guide.
This blog post, '#1,207 – C# 6.0 – Auto-Property Initializers for Read-Only Properties' by Sean Sexton Có một lời giải thích tốt và ví dụ như sau:
Trước C# 6.0, nếu bạn muốn có một read-only (không thay đổi) thuộc tính, bạn muốn thường sử dụng một trường chỉ đọc ủng hộ mà được khởi tạo trong hàm tạo , như được hiển thị bên dưới.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
private readonly DateTime creTime;
public DateTime DogCreationTime
{
get { return creTime; }
}
public Dog(string name)
{
Name = name;
creTime = DateTime.Now;
}
}
Trong C# 6.0, bạn có thể sử dụng tính năng tự động thực hiện để thực hiện một thuộc tính chỉ đọc. Bạn thực hiện việc này bằng cách sử dụng trình khởi tạo tự động . Kết quả là sạch hơn nhiều so với ví dụ trên, trong đó chúng tôi phải khai báo rõ ràng trường sao lưu.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
public DateTime DogCreationTime { get; } = DateTime.Now;
public Dog(string name)
{
Name = name;
}
}
Thông tin chi tiết cũng có thể được tìm thấy trong the dotnet Roslyn repo on GitHub:
Auto-tính bây giờ có thể được khai báo mà không có một setter.
Trường sao lưu của thuộc tính tự động chỉ getter được ẩn hoàn toàn được khai báo là chỉ đọc (mặc dù điều này chỉ quan trọng cho mục đích phản ánh ). Nó có thể được khởi tạo thông qua một bộ khởi tạo trên thuộc tính như trong ví dụ trên. Ngoài ra, một tài sản getter-chỉ có thể là giao cho trong cơ thể constructor kiểu tuyên bố, mà làm cho giá trị được gán trực tiếp đến lĩnh vực cơ bản:
Đây là bày tỏ những loại chính xác hơn, nhưng lưu ý rằng nó cũng loại bỏ sự khác biệt quan trọng trong ngôn ngữ giữa các loại có thể thay đổi và : các thuộc tính tự động là viết tắt chỉ có sẵn nếu bạn sẵn sàng làm cho lớp của bạn có thể thay đổi được và do đó, cám dỗ là . Giờ đây, với các thuộc tính tự động chỉ dành cho getter, trường chơi đã được cân bằng giữa tính có thể thay đổi và không thay đổi được.
và trong C# 6.0 draft Language Specification:
tính thực hiện tự động
Một tính chất tự động thực hiện (hoặc tự động tài sản cho ngắn), là một tổ chức phi trừu tượng phi extern tài sản với accessorolon-only accessor cơ quan. Thuộc tính tự động phải có trình truy cập nhận và có thể tùy chọn có bộ truy cập đã đặt.
Khi thuộc tính được chỉ định là thuộc tính được tự động triển khai, trường sao lưu ẩn tự động có sẵn cho thuộc tính, và người truy cập được triển khai để đọc và ghi vào trường sao lưu đó . Nếu thuộc tính tự động không có bộ truy cập đã đặt, trường ủng hộ được coi là chỉ đọc (các trường chỉ đọc). Cũng giống như một trường chỉ đọc chỉ đọc, một thuộc tính tự động chỉ getter cũng có thể được gán vào phần thân của một hàm tạo của lớp kèm theo. Bài tập này chỉ định trực tiếp đến trường ủng hộ chỉ đọc của thuộc tính.
Thuộc tính tự động có thể tùy ý có thuộc tính property_initializer, là được áp dụng trực tiếp vào trường sao lưu dưới dạng biến_initializer (Trình khởi tạo biến).
Nó không thực sự sử dụng một setter (bởi vì nó không có). Nó trực tiếp thiết lập trường cơ bản (được ẩn từ chúng tôi, đó là lý do tại sao bạn cần sử dụng tên thuộc tính) –
Sử dụng nào là thuộc tính, nếu nó có thể ** không bao giờ ** được khởi tạo/thiết lập? Yacoub Massad đã trả lời nó một cách hoàn hảo – Vikhram