gpt4 book ai didi

c# - 如何防止方法调用者修改返回的集合?

转载 作者:行者123 更新时间:2023-11-30 15:12:30 25 4
gpt4 key购买 nike

<分区>

我有一些方法将私有(private)集合返回给调用者,我想阻止调用者修改返回的集合。

private readonly Foo[] foos;

public IEnumerable<Foo> GetFoos()
{
return this.foos;
}

目前私有(private)集合是一个固定数组,但将来如果需要在运行时添加新项目,集合可能会变成一个列表。

有几种解决方案可以防止调用者修改集合。返回IEnumerable<T>是最简单的解决方案,但调用者仍然可以将返回值向上转换为 IList<T>并修改集合。

((IList<Foo>)GetFoos())[0] = otherFoo;

克隆集合有一个明显的缺点,即有两个集合可以独立进化。到目前为止,我已经考虑了以下选项。

  1. 将集合包装在 ReadOnlyCollection<T> 中.
  2. 返回 Enumerable 定义的 LINQ 迭代器之一通过执行类似 list.Select(item => item) 的虚拟投影来上课.实际上我考虑使用 Where(item => true)因为返回的迭代器看起来更轻量级。
  3. 编写自定义包装器。

我不喜欢使用 ReadOnlyCollection<T> 的地方是它实现了IList<T>并调用 Add()或访问索引器将导致异常。虽然这在理论上是绝对正确的,但几乎没有真正的代码检查 IList<T>.IsReadOnlyIList<T>.IsFixedSize .

使用 LINQ 迭代器 - 我将代码包装在扩展方法中 MakeReadOnly() - 防止这种情况,但它有黑客的味道。

编写自定义包装器?重新发明轮子?

有什么想法、注意事项或其他解决方案吗?


在标记这个问题时,我发现了 this Stack Overflow question我以前没有注意到。 Jon Skeet 建议也使用“LINQ hack”,但使用 Skip(0) 效率更高.

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com