Vì một lý do nào đó, tôi luôn giả định rằng các trường readonly
có chi phí liên quan đến chúng, mà tôi nghĩ là CLR theo dõi xem trường có được khởi tạo hay không. Chi phí ở đây sẽ là sử dụng bộ nhớ bổ sung để theo dõi trạng thái và kiểm tra khi gán giá trị. Có lẽ tôi giả định điều này bởi vì tôi không biết một trường readonly
chỉ có thể được khởi tạo bên trong một hàm tạo hoặc trong khai báo trường và không có kiểm tra thời gian chạy, bạn sẽ không thể đảm bảo nó không được gán nhiều lần trong nhiều phương pháp khác nhau. Nhưng bây giờ tôi biết điều này, nó có thể dễ dàng được kiểm tra tĩnh bởi trình biên dịch C#, phải không? Vì vậy, là trường hợp?Có bất kỳ chi phí nào trong thời gian chạy để chỉ đọc không?
Lý do khác là tôi đã đọc rằng việc sử dụng readonly
có tác động hiệu suất 'nhẹ', nhưng họ chưa bao giờ đi vào xác nhận quyền sở hữu này và tôi không thể tìm thấy thông tin về chủ đề này, do đó câu hỏi của tôi. Tôi không biết tác động nào khác của hiệu suất có thể ngoài việc kiểm tra thời gian chạy.
Lý do thứ ba là tôi thấy rằng readonly
được lưu giữ trong IL được biên dịch là initonly
, do đó, lý do cho thông tin này ở trong IL là readonly
là gì hơn là đảm bảo bởi trình biên dịch C# không bao giờ được gán cho bên ngoài một hàm tạo hoặc khai báo? Mặt khác, tôi đã phát hiện ra rằng bạn có thể đặt giá trị của một readonly int
thông qua phản ánh mà không có CLR ném một ngoại lệ, điều này không thể thực hiện được nếu readonly
là kiểm tra thời gian chạy.
Vì vậy, tôi đoán là: 'tính chỉ đọc' chỉ là một tính năng thời gian biên dịch, bất kỳ ai có thể xác nhận/từ chối điều này? Và nếu có, lý do cho thông tin này được đưa vào IL là gì?
Rất tiếc, bạn đã tìm thấy cùng một phân tích hiệu suất mà tôi đã làm. Vì vậy, +1 cho bạn và tôi đã xóa câu trả lời (chi tiết hơn) của tôi. – Eddie
Làm cho cảm giác hoàn hảo, cảm ơn :) – JulianR