8
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改用吗?

4

2 回答 2

14

简而言之:我认为 Jon Skeet 给出了一个非常好的答案 - ReadOnlyCollection 或 IEnumerable 用于公开成员集合?

另外: 您可以模拟AsReadOnly()

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

更新
这不会创建list. ReadOnlyCollection不复制数据,它直接在提供的列表上工作。请参阅文档

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

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

于 2012-12-31T18:00:31.890 回答
1

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

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

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

于 2012-12-31T17:59:13.837 回答