【问题标题】:ReadOnlyCollection IEnumerableReadOnlyCollection IEnumerable
【发布时间】:2012-12-15 19:04:05
【问题描述】:
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 吗?

【问题讨论】:

标签: c# .net linq


【解决方案1】:

简而言之:我认为 Jon Skeet 的回答非常好 - ReadOnlyCollection or IEnumerable for exposing member collections?

另外: 你可以模仿AsReadOnly():

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-19
      • 2010-10-04
      • 2014-09-12
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多