Câu trả lời:
Vâng, cả hai đều chỉ đọc, nhưng có một sự khác biệt. Trong trường đầu tiên, có một trường sao lưu được khởi tạo thành 0 trước khi hàm tạo được thực thi. Bạn chỉ có thể thay đổi giá trị 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 cái thứ hai, getter chỉ trả về 0 mỗi lần, không có trường nào liên quan.
Vì vậy, để tránh sử dụng bất kỳ thuộc tính được thực hiện tự động hoặc các thành viên thân biểu hiện nào, chúng tôi có:
Phiên bản đầu tiê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 hơn về sự khác biệt có thể được nhìn thấy như thế này:
public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;
Nếu bạn tạo một đối tượng, thuộc tính của nó CreationTime
sẽ luôn cho kết quả tương tự - bởi vì nó được lưu trữ trong trường chỉ đọc, được khởi tạo khi xây dựng đối tượng. Tuy nhiên, mỗi khi bạn truy cập vào CurrentTime
tài sản, điều đó sẽ DateTime.UtcNow
được đánh giá, do đó bạn sẽ nhận được một kết quả khác.
Một sự khác biệt là khi điều đó 0
được đánh giá: khi tạo đối tượng hoặc khi tài sản được sử dụng.
Bạn có thể thấy điều này tốt hơn với các thuộc tính DateTime:
class SomeTestClass
{
public DateTime Start { get; } = DateTime.Now;
public DateTime Now => DateTime.Now;
}
Các Start
bất động sản tiếp tục quay trở lại cùng một lúc (trong khi các trường hợp đã được tạo ra), trong khi Now
thay đổi để phản ánh thời gian hiện tại.
Giải thích :
Phiên bản đầu tiên ("Bắt đầu") cung cấp một giá trị ban đầu thậm chí có thể được ghi đè bởi nhà xây dựng. Vì vậy, điều này được đánh giá chỉ một lần.
Phiên bản thứ hai ("Bây giờ") cung cấp biểu thức sẽ là "getter" của thuộc tính này. Vì vậy, điều này được đánh giá mỗi khi tài sản được đọc. Thậm chí không có trường sao lưu mà hàm tạo có thể ghi đè.
Đây là các tính năng ngôn ngữ C # 6.
Ví dụ đầu tiên
public int Number { get; } = 0
Ví dụ đầu tiên là một thuộc tính tự động chỉ getter . Trường sao lưu của thuộc tính tự động chỉ getter được khai báo ngầm là chỉ đọc.
Ví dụ thứ hai
public int Number => 0;
Và ví dụ thứ hai là các biểu thức trên các thành viên hàm giống như thuộc tính . Lưu ý rằng không có bất kỳ get
từ khóa nào : Nó được ngụ ý bởi việc sử dụng cú pháp thân biểu thức.
Cả hai đều chỉ đọc.
random.NextInt()
. Phiên bản đầu tiên sẽ đánh giá rằng 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.