在属性中公开IEnumerable是否安全?

10 .net c# ienumerable

如果我将一个类IEnumerable<T>作为一个类的属性公开,它是否有可能被一个类的用户变异,如果是这样,什么是防止变异的最佳方法,同时保持暴露属性的类型IEnumerable<T>

Jon*_*eet 14

这取决于你的回归.如果你返回(比方说)一个mutable,List<string>那么客户端确实可以将它转回List<string>并改变它.

如何保护您的数据取决于您必须从哪开始.ReadOnlyCollection<T>是一个很好的包装类,假设你有一个IList<T>开始.

如果您的客户端将无法从返回值实现受益IList<T>或者ICollection<T>,你总是可以这样做:

public IEnumerable<string> Names
{
    get { return names.Select(x => x); }
}
Run Code Online (Sandbox Code Playgroud)

它有效地将集合包装在迭代器中.(有各种不同的方法可以使用LINQ来隐藏源代码......虽然没有记录哪些操作符隐藏了源代码,哪些代码却没有.例如,调用Skip(0) 隐藏Microsoft实现中的源代码,但没有记录要做所以.)

Select绝对应该隐藏源头.