ReadOnlyCollection IEnumerable


string[] _myStrings = { "Hello", "There", "Happy", "Day" };
public IEnumerable<string> MyStrings1
{
    get
    {
        return new System.Collections.ObjectModel.ReadOnlyCollection<string>(_myStrings);
    }
}
public IEnumerable<string> MyStrings2
{
    get
    {
        return from s in _myStrings select s;
    }
}

我看到一些关于不使用数组作为公共属性的讨论。我一直在使用MyStrings2公约。有什么理由我应该用MyStrings1代替吗?

总之:我认为你的问题是由Jon Skeet - ReadOnlyCollection或IEnumerable为暴露成员集合提供了一个完美的答案?

除了:

你可以直接模拟AsReadOnly():

public ReadOnlyCollection<Abc> List
{
    get { return new ReadOnlyCollection(list); }
}

:
这不会创建list的副本。ReadOnlyCollection不复制数据,它直接在提供的列表上工作。看到文档:

一个只读的集合就是一个带包装的集合,包装可以防止对集合进行修改;因此,如果对底层集合进行了更改,只读集合将反映这些更改。

构造函数是一个0(1)操作。

将数组直接暴露给使用它的人意味着他们可以修改它——这违反了封装和数据隐藏。

这可能是一个问题,当你的类有一些不变量(保证它做什么和它持有的数据),因为它不能保证,如果其他类可以随意改变它的内部。

在多线程环境中,这甚至是一个更大的问题,因为一个线程可以更改数据,而另一个线程正在尝试读取数据-您很容易在不同的线程中获得不一致的数据。

相关内容

  • 没有找到相关文章

最新更新