ReadOnlyCollection IEnumerable

时间:2012-12-31 17:57:36

标签: c# .net linq

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

2 个答案:

答案 0 :(得分:14)

简而言之:我认为你的问题是由Jon Skeet提供的一个非常好的答案 - ReadOnlyCollection or IEnumerable for exposing member collections?

此外: 您可以模仿AsReadOnly()

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

<强>更新
这不会创建list的副本。 ReadOnlyCollection不会复制数据,它直接在提供的列表中工作。见documentation

  

只读集合只是一个带有包装器的集合,可以防止修改集合;因此,如果对基础集合进行了更改,则只读集合会反映这些更改。

     

此构造函数是O(1)操作。

答案 1 :(得分:1)

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

当你的类有一些不变量(保证它的作用和它所拥有的数据)时,这可能是一个问题,因为如果其他类可以随时改变它的内部,它就无法保证。

在多线程环境中,这更是一个问题,因为一个线程可以对数据进行更改而另一个线程正在尝试读取数据 - 您可以轻松地在不同的线程中获取不一致的数据。