Trong Design Guidelines for Developing Class Libraries, Microsoft nói:Tại sao Microsoft khuyên các trường chỉ đọc với các giá trị có thể thay đổi?
Do not assign instances of mutable types to read-only fields.
The objects created using a mutable type can be modified after they are created. For example, arrays and most collections are mutable types while Int32, Uri, and String are immutable types. For fields that hold a mutable reference type, the read-only modifier prevents the field value from being overwritten but does not protect the mutable type from modification.
này chỉ đơn giản là đạt lại hành vi của readonly mà không giải thích lý do tại sao nó xấu để sử dụng readonly. Hàm ý dường như là nhiều người không hiểu những gì "chỉ đọc" và sẽ mong đợi sai các trường chỉ đọc là không thay đổi sâu sắc. Trong thực tế, nó khuyên sử dụng "readonly" như tài liệu mã chỉ ra tính bất biến sâu - mặc dù thực tế là trình biên dịch không có cách nào để thực thi điều này - và không cho phép sử dụng nó cho hàm bình thường của nó: để đảm bảo rằng giá trị của trường không thay đổi sau đối tượng đã được xây dựng.
Tôi cảm thấy khó chịu với đề xuất này để sử dụng "chỉ đọc" để chỉ ra một điều gì đó khác với ý nghĩa bình thường của nó được hiểu bởi trình biên dịch. Tôi cảm thấy rằng nó khuyến khích mọi người hiểu lầm ý nghĩa của "chỉ đọc", và hơn nữa để mong đợi nó có nghĩa là một cái gì đó mà tác giả của mã có thể không có ý định. Tôi cảm thấy rằng nó ngăn cản việc sử dụng nó ở những nơi nó có thể hữu ích - ví dụ để cho thấy rằng một số mối quan hệ giữa hai đối tượng có thể thay đổi sẽ không thay đổi trong suốt vòng đời của một trong những đối tượng đó. Khái niệm giả định rằng người đọc không hiểu ý nghĩa của "chỉ đọc" cũng có vẻ mâu thuẫn với lời khuyên khác của Microsoft, chẳng hạn như quy tắc "Do not initialize unnecessarily" của FxCop, giả định độc giả mã của bạn là chuyên gia về ngôn ngữ và nên biết rằng (ví dụ) các trường bool được tự động khởi tạo thành false và dừng bạn cung cấp dự phòng cho thấy "có, điều này đã được đặt thành ý thức thành sai; tôi không quên khởi tạo nó".
Vì vậy, trước tiên và quan trọng nhất, tại sao Microsoft khuyên không nên sử dụng chỉ đọc để tham chiếu đến các loại có thể thay đổi? Tôi cũng muốn được biết:
- Bạn có làm theo Hướng dẫn thiết kế này trong tất cả mã của bạn không?
- Bạn mong đợi điều gì khi thấy "chỉ đọc" trong một đoạn mã bạn không viết?
100% đồng ý. Hướng dẫn điển hình của Microsoft. \ * flush \ * –
Tôi không thể nói rằng tôi không thiên vị. ;) Tôi cảm thấy rằng câu trả lời của Anthony, trong khi chính xác, không nói bất cứ điều gì chưa được nêu trong hướng dẫn: các tham chiếu chỉ đọc cho các đối tượng có thể thay đổi là xấu ... vì đối tượng có thể thay đổi. Mặt khác, câu trả lời của bạn ít nhất là giải thích tại sao bạn có thể muốn có tham chiếu chỉ đọc cho các đối tượng có thể thay đổi được. Bây giờ tôi nhìn vào nó, có lẽ câu trả lời của câu trả lời là - nói đúng - câu trả lời chính xác nhất cho câu hỏi tôi đã hỏi ban đầu. – Weeble