列表类型绕过ReadOnly属性?

时间:2009-12-12 16:24:51

标签: .net oop list

当使用具有List或类似类型的只读属性的自定义类(即ObservableCollection)时,仍然可以“获取”变量并在其上调用Add()方法来更改内容。

有没有办法在“外部”访问时停止此操作(不会创建List类的巨大重载),或者如果不应在其类之外编辑它们,以另一种方式处理列表是“最佳实践” ?

2 个答案:

答案 0 :(得分:5)

当您将引用类型十分转换为只读时,只读取对象的引用。对象本身仍然可以修改。对于List,您可以使用ReadOnlyCollection来公开集合,以便它不能被修改(并且您仍然可以在内部使用List来存储/修改数据。

FxCop实际上有一个规则来捕捉这些情况:

Do not declare read only mutable reference types

private List<string> _internalList = new List<string>();

public ReadOnlyCollection<string> ListProperty
{
    get
    {
        return _inernalList.AsReadOnly();
    }
}

应该这样做。

答案 1 :(得分:2)

您应该公开任何类型的属性:

ReadOnlyCollection<T>

在只读引用属性的情况下,“只读”是对象的引用 - 它不会使对象不可变。