关于c#:方法返回的ReadOnlyCollection类型是什么?

What ReadOnlyCollection type should methods return?

我看到过返回"ilist"和"icolection"和"collection"以及它链接到的其他问题,但我仍然对这个问题感到困惑。

为了演示的目的,让我们假设我有一个类,其中公开了一个公共方法,如下所示:

1
2
3
4
5
public ReadOnlyCollection<Type> GetReadOnlyCollection(IEnumerable<Type> enumerable)
{
    List<Type> list = enumerable.ToList();
    return new ReadOnlyCollection<Type>(list);
}

为了遵循CA1002,如果我特别想返回一个ReadOnlyCollection,我的方法是否应该返回实际的收集类(ReadOnlyCollectionCollection等)或它们的接口(IListICollection等)?


如果返回尽可能通用的类型,则可以获得稍后更改实现的灵活性。当然,您必须返回一个对消费者有用的类型。因此,一般来说,返回接口类型更好,更一般的类型也更好,只要这不会在使用者端造成任何使用问题。


我最初的问题没有很好的定义;应该考虑以下几个因素:

  • 用户只需要通过代码枚举吗?如果是这样,IEnumerable可能就足够了。
  • 用户是否应该知道集合是只读的?如果是这样的话,IReadOnlyCollection可能是好的。
  • 是否要阻止用户将只读集合强制转换为可变类型?如果是,请使用来自System.Collections.Immutable的不可变集合。

这些问题中有一些有用的答案:

  • 用于公开成员集合的ReadOnlyCollection或IEnumerable?
  • 用于公开列表成员的IEnumerable与IReadonlyCollection与ReadOnlyCollection