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
?
答案 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)
将数组直接暴露给那些使用它的人意味着他们可以修改它 - 这违反了封装和数据隐藏。
当你的类有一些不变量(保证它的作用和它所拥有的数据)时,这可能是一个问题,因为如果其他类可以随时改变它的内部,它就无法保证。
在多线程环境中,这更是一个问题,因为一个线程可以对数据进行更改而另一个线程正在尝试读取数据 - 您可以轻松地在不同的线程中获取不一致的数据。