C# 只读集合IEnumerable string[]\u myStrings={“你好”,“那里”,“快乐”,“一天”}; 公共IEnumerable MyStrings1 { 得到 { 返回新的System.Collections.ObjectModel.ReadOnlyCollection(\u myString); } } 公共IEnumerable MyStrings2 { 得到 { 从s返回,在_myStrings选择s; } }

C# 只读集合IEnumerable string[]\u myStrings={“你好”,“那里”,“快乐”,“一天”}; 公共IEnumerable MyStrings1 { 得到 { 返回新的System.Collections.ObjectModel.ReadOnlyCollection(\u myString); } } 公共IEnumerable MyStrings2 { 得到 { 从s返回,在_myStrings选择s; } },c#,.net,linq,C#,.net,Linq,我看到一些关于不将数组用于公共属性的讨论。 我一直在使用MyStrings2惯例。有什么理由我应该改用MyStrings1吗?将数组直接暴露给使用它的人意味着他们可以修改它-这违反了封装和数据隐藏 当您的类具有一些不变量(保证它所做的事情和它所持有的数据)时,这可能是一个问题,因为如果其他类可以随意更改其内部结构,则无法保证 在多线程环境中,这是一个更大的问题,因为一个线程可以对数据进行更改,而另一个线程正在尝试读取数据-您很容易在不同的线程中获得不一致的数据。简言之:我认为Jon Skeet对

我看到一些关于不将数组用于公共属性的讨论。
我一直在使用
MyStrings2
惯例。有什么理由我应该改用MyStrings1吗?

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

当您的类具有一些不变量(保证它所做的事情和它所持有的数据)时,这可能是一个问题,因为如果其他类可以随意更改其内部结构,则无法保证


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

简言之:我认为Jon Skeet对您的问题给出了完美的答案-

此外: 您只需模拟
AsReadOnly()

公共只读集合:

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

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

可能重复的
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;
    }
}
public ReadOnlyCollection<Abc> List
{
    get { return new ReadOnlyCollection(list); }
}