题
我正在创建一个不可改变的类。
我有标记的所有属性为只读。
我有一个列表中的项目类。
虽然如果财产是只读的清单可以加以修改。
暴露的综合名单,使得它不可改变的。
我想知道什么是基本规则的一个有遵循做出类不可改变的?
解决方案
我觉得你是在正确的轨道
- 所有的信息注入类应提供的构造
- 所有属性,应该只能干将
- 如果一个集(或阵列)通过成本构造,应当复制到保持呼叫者从修改后
- 如果你要回你的收集、回复或只读版本(例如,使用 对列表.只读的 或类似的-您可以将这与前一点 商店 只读副返回时的呼叫者访问),回枚举,或者使用一些其他的方法/属性,允许只读进入集合
- 请记住,你仍然可能具有的可变类,如果任何成员是易变的-如果是这种情况下,应复制离开任何国家,你会希望保留,避免返回的整个可变的目的,除非其复制之前给他们回到呼叫另一个选择是只返回不可改变"部分"的可变对象-谢谢@布赖恩*拉斯穆森鼓励我展开这一点
其他提示
要为不可变的,所有的属性和字段应该是只读的。在任何列表中的项目本身应该是一成不变的。
您可以做一个只读列表属性如下:
public class MyClass
{
public MyClass(..., IList<MyType> items)
{
...
_myReadOnlyList = new List<MyType>(items).AsReadOnly();
}
public IList<MyType> MyReadOnlyList
{
get { return _myReadOnlyList; }
}
private IList<MyType> _myReadOnlyList
}
此外,牢记的是:
public readonly object[] MyObjects;
并不是一成不变的,即使它标有只读关键字。仍可以通过索引存取改变单个数组引用/值。
使用ReadOnlyCollection
类。它坐落在System.Collections.ObjectModel
命名空间。
在任何返回列表(或在构造函数),设置列表作为一个只读集合。
using System.Collections.ObjectModel;
...
public MyClass(..., List<ListItemType> theList, ...)
{
...
this.myListItemCollection= theList.AsReadOnly();
...
}
public ReadOnlyCollection<ListItemType> ListItems
{
get { return this.myListItemCollection; }
}
另一种选择是,而不是使用在所有暴露任何内部集合一个访问者模式。
不隶属于 StackOverflow