我正在创建一个不可改变的类。
我有标记的所有属性为只读。

我有一个列表中的项目类。
虽然如果财产是只读的清单可以加以修改。

暴露的综合名单,使得它不可改变的。
我想知道什么是基本规则的一个有遵循做出类不可改变的?

有帮助吗?

解决方案

我觉得你是在正确的轨道

  • 所有的信息注入类应提供的构造
  • 所有属性,应该只能干将
  • 如果一个集(或阵列)通过成本构造,应当复制到保持呼叫者从修改后
  • 如果你要回你的收集、回复或只读版本(例如,使用 对列表.只读的 或类似的-您可以将这与前一点 商店 只读副返回时的呼叫者访问),回枚举,或者使用一些其他的方法/属性,允许只读进入集合
  • 请记住,你仍然可能具有的可变类,如果任何成员是易变的-如果是这种情况下,应复制离开任何国家,你会希望保留,避免返回的整个可变的目的,除非其复制之前给他们回到呼叫另一个选择是只返回不可改变"部分"的可变对象-谢谢@布赖恩*拉斯穆森鼓励我展开这一点

其他提示

要为不可变的,所有的属性和字段应该是只读的。在任何列表中的项目本身应该是一成不变的。

您可以做一个只读列表属性如下:

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; }
}

另一种选择是,而不是使用在所有暴露任何内部集合一个访问者模式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top