Có, cả hai đều chỉ đọc, nhưng có sự khác biệt. Trong trường hợp đầu tiên, có một trường sao lưu được khởi tạo là 0 trước khi hàm tạo được thực hiện. Bạn chỉ có thể thay đổi giá trị chỉ trong hàm tạo, giống như trường chỉ đọc thông thường. Bản thân getter chỉ trả về giá trị của trường.
Trong bước thứ hai, trình lấy chỉ trả về 0 mỗi lần, không có trường liên quan.
Vì vậy, để tránh sử dụng bất kỳ thuộc tính tự động thực hiện hoặc các thành viên biểu hiện thân ở tất cả, chúng ta có:
Đầu tiên phiên bản
private readonly int _number = 0;
public int Number { get { return _number; } }
phiên bản thứ hai
public int Number { get { return 0; } }
Một ví dụ rõ ràng về sự khác biệt có thể được nhìn thấy như sau:
public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;
Nếu bạn tạo một đối tượng duy nhất, thuộc tính CreationTime
sẽ luôn cho kết quả tương tự - vì nó được lưu trữ trong trường chỉ đọc, được khởi tạo trên đối tượng xây dựng. Tuy nhiên, mỗi khi bạn truy cập thuộc tính CurrentTime
, điều này sẽ khiến cho DateTime.UtcNow
được đánh giá, do đó bạn sẽ nhận được kết quả có khả năng khác.
Nguồn
2017-09-05 05:46:18
Lưu ý rằng phiên bản thứ hai không phải lúc nào cũng trả lại cùng một giá trị. Một ví dụ tốt là nếu bạn trả về 'random.NextInt()'. Phiên bản đầu tiên sẽ đánh giá một lần và luôn có cùng giá trị. Thứ hai sẽ trả về một giá trị mới mỗi lần. – Hosch250