Tôi đang đọc blog của Eric Liperts về Mutating Readonly Structs và tôi thấy nhiều tham chiếu ở đây trong SO cho blog này làm đối số tại sao các loại giá trị phải không thay đổi. Nhưng vẫn có một điều không rõ ràng, nói rằng khi bạn truy cập vào loại giá trị mà bạn luôn luôn nhận được bản sao của nó và đây là ví dụ:Các loại giá trị không thể thay đổi
struct Mutable
{
private int x;
public int Mutate()
{
this.x = this.x + 1;
return this.x;
}
}
class Test
{
public readonly Mutable m = new Mutable();
static void Main(string[] args)
{
Test t = new Test();
System.Console.WriteLine(t.m.Mutate());
System.Console.WriteLine(t.m.Mutate());
System.Console.WriteLine(t.m.Mutate());
}
}
Và câu hỏi này là lý do tại sao khi tôi thay đổi
public readonly Mutable m = new Mutable();
để
public Mutable m = new Mutable();
tất cả mọi thứ bắt đầu làm việc es dự kiến .
Vui lòng giải thích rõ hơn lý do loại giá trị phải không thay đổi. Tôi biết rằng nó là tốt cho an toàn thread, nhưng trong trường hợp này cùng có thể được áp dụng cho các loại tài liệu tham khảo.
Tôi sẽ không biết cách trả lời câu hỏi này mà không cần sao chép và dán thêm các trích dẫn từ bài đăng trên blog mà bạn đã liên kết. 'm' là' readonly' là cái làm cho 't.m' là một giá trị, mà không phải là một biến được đặt trong một biến tạm thời, và nó là biến tạm thời này là' this' trong phương thức 'Mutate'. Lấy đi 'readonly', và các yếu tố còn lại không còn áp dụng nữa, vì vậy' this' trong 'Mutate' có thể là' m'. –