gpt4 book ai didi

c# - 用于公开成员集合的 ReadOnlyCollection 或 IEnumerable?

转载 作者:IT王子 更新时间:2023-10-29 03:34:13 26 4
gpt4 key购买 nike

如果调用代码仅遍历集合,是否有任何理由将内部集合公开为 ReadOnlyCollection 而不是 IEnumerable?

class Bar
{
private ICollection<Foo> foos;

// Which one is to be preferred?
public IEnumerable<Foo> Foos { ... }
public ReadOnlyCollection<Foo> Foos { ... }
}


// Calling code:

foreach (var f in bar.Foos)
DoSomething(f);

在我看来,IEnumerable 是 ReadOnlyCollection 接口(interface)的一个子集,它不允许用户修改集合。因此,如果 IEnumberable 接口(interface)足够,那么就可以使用它。这是一种正确的推理方式还是我遗漏了什么?

谢谢/埃里克

最佳答案

更现代的解决方案

除非你需要内部集合是可变的,否则你可以使用 System.Collections.Immutable 包,将您的字段类型更改为不可变集合,然后直接公开它 - 假设 Foo当然,它本身是不可变的。

更新答案以更直接地解决问题

Is there any reason to expose an internal collection as a ReadOnlyCollection rather than an IEnumerable if the calling code only iterates over the collection?

这取决于您对调用代码的信任程度。如果您完全控制将调用此成员的所有内容,并且您保证任何代码都不会使用:

ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);

那当然了,直接把藏品退回去也没什么坏处。不过,我通常会尽量表现得偏执一些。

同样,如您所说:如果您只需要 IEnumerable<T> ,那为什么要把自己绑在更强大的东西上呢?

原始答案

如果您使用的是 .NET 3.5,则可以通过简单地调用 Skip 来避免复制避免简单的转换:

public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}

(有很多其他选项可以简单地包装 - Skip 优于 Select/Where 的好处是没有委托(delegate)在每次迭代中毫无意义地执行。)

如果您不使用 .NET 3.5,您可以编写一个非常简单的包装器来做同样的事情:

public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}

关于c# - 用于公开成员集合的 ReadOnlyCollection 或 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/491375/

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