C# 中的 readonly 關鍵字表示類中的字段只允許在定義時候或者構造方法中初始化。普通類型的數據完全可以達到預期的效果,但是在對象或者列表中,要想達到只讀的效果,只用一個 readonly 關鍵字是不可以的。當你把一個 List 用 readonly 修飾,在其他類中仍然可以使用 Add,Remove 方法來改變它。但是可能你想要的只讀屬性是:只有在當前類中修改這個列表的 item,才不想被其他類做任何修改!
下面這個示例就是用 readonly 關鍵字修飾的一個 List,它的內容項目仍然可以在其他類中添加或刪除:
就算封裝成只讀屬性,仍然可以在其他類中操作:
不過你可以將屬性的類型改為 IEnumerable<T> ,這樣就可以達到想要的效果。因為 IEnumerable<T> 類沒有 Add, Remove 方法,List<T> 類繼承 IEnumerable<T> 類,在 List<T> 類中新增的 Add, Remove 等方法:
如果你想創建一個完全只讀的屬性,就算在當前類中都不可以修改它的 item,你可以使用 ReadOnlyCollection<T> :
在 .NET 4.5 中,List<T> 繼承了 IReadOnlyList<T> 和 IReadOnlyCollection<T>,給了我們一種更簡單的寫法,同樣可以達到上述效果: