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>,给了我们一种更简单的写法,同样可以达到上述效果: