Về cơ bản, bạn hiểu sai ý nghĩa của cả hai định nghĩa đó. Chỉ hiển thị bộ thu hút nói không có gì là về việc liệu giá trị có phải chỉ đọc hay không.
Trong khi trong ví dụ tầm thường này:
public class GetOnly
{
public string MyProp { get; }
}
Chúng tôi có thể nói rằng MyProp
sẽ không bao giờ thay đổi giá trị của nó, chúng ta không thể luôn luôn nói rằng một tài sản getter chỉ sẽ không có giá trị của nó thay đổi. Ví dụ về trường hợp này là một trường hợp mà chúng tôi không thể xem việc triển khai GetOnly
và chỉ biết về định nghĩa công khai - Ví dụ: nếu bạn đang làm việc với thư viện bên thứ ba nguồn đóng.
Một ví dụ rõ ràng hơn là thế này:
public interface ISomething
{
string MyProp { get; }
}
Giao diện này không nói rằng MyProp
là read-only. Nó nói rằng bạn không thể thay đổi thuộc tính. Nó không nói gì về hành vi của tài sản. Thậm chí tệ hơn, nó chỉ nói rằng bạn không thể thay đổi tài sản khi đúc một cách rõ ràng là ISomething
.
Đó là hoàn toàn thể thực hiện các giao diện như vậy (mặc dù giao diện duy nhất cho thấy nhiều getter):
public class GetOnly : ISomething
{
public string MyProp { get; set; }
}
readonly
là một modifier mà thực thi một cách rõ ràng thực tế là giá trị sẽ không bao giờ thay đổi , ngoại trừ trong tuyên bố hoặc nhà xây dựng (cách xử lý các cách giải quyết như reflection).
Tuy nhiên, readonly
không thể hoạt động trên thuộc tính vì thuộc tính chỉ đơn giản là cú pháp đường cho phương thức get/set . Hơn nữa, các giao diện chỉ xác định các phương thức, và như vậy bạn không thể xác định các trường (và bởi các trường mở rộng, chỉ đọc).
Vì vậy, để trả lời câu trả lời của bạn: Vâng, chúng cách nhau một thế giới và chỉ tương tự trên bề mặt.
Bạn có thể triển khai giao diện trên lớp ReadOnly với triển khai rõ ràng –