从具有IList返回类型的方法返回ReadOnlyCollection

时间:2010-04-26 06:12:05

标签: c# .net

这里我有以下代码:

    private IList<IState> _states = new List<IState>();
    private ReadOnlyCollection<IState> _statesViewer;

    public IList<IState> States { get { return _statesViewer; } }

我认为通常最好返回接口而不是具体类本身,但在这种情况下,我不应该将States属性设置为ReadOnlyCollection的返回类型吗?

如果我将其设置为IList,我图书馆的任何用户都会认为可以执行任何操作,这意味着添加元素。事实并非如此,我肯定违反了将其暴露为IList的合同。

我对这个观点是对的还是我在这里还有其他的东西?

4 个答案:

答案 0 :(得分:6)

做任何使API最清晰的事情。如果调用者只需要枚举它,您可以公开为IEnumerable<T>,但我不会担心将其暴露为ReadOnlyCollection。您可以只使用索引器和枚举器声明自定义类型(接口或类),当然

答案 1 :(得分:3)

如果是我,我会将其公开为

IEnumerable<IState>

答案 2 :(得分:2)

对于代表序列的任何公共属性,

IEnumerable<T>是一个不错的选择。

这是最小的合同,它仍然是一个序列,可以帮助你保持解耦。

它可以在Linq中为对象提供丰富的操作集合,因此您可以为消费者提供强大的功能。

答案 3 :(得分:2)

在某些情况下,如果只允许人们在列表上运行,我会使用IEnumerable<IState>。但是,如果我需要一些外部世界的内置功能,如索引运算符,Count,Contains,IndexOf等,我会给它们ReadOnlyCollection作为IList并在文档中写入它是只读的。