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)操作。
将数组直接暴露给使用它的人意味着他们可以修改它——这违反了封装和数据隐藏。
这可能是一个问题,当你的类有一些不变量(保证它做什么和它持有的数据),因为它不能保证,如果其他类可以随意改变它的内部。
在多线程环境中,这甚至是一个更大的问题,因为一个线程可以更改数据,而另一个线程正在尝试读取数据-您很容易在不同的线程中获得不一致的数据。