这里我有以下代码:
private IList<IState> _states = new List<IState>();
private ReadOnlyCollection<IState> _statesViewer;
public IList<IState> States { get { return _statesViewer; } }
我认为通常最好返回接口而不是具体类本身,但在这种情况下,我不应该将States
属性设置为ReadOnlyCollection
的返回类型吗?
如果我将其设置为IList
,我图书馆的任何用户都会认为可以执行任何操作,这意味着添加元素。事实并非如此,我肯定违反了将其暴露为IList的合同。
我对这个观点是对的还是我在这里还有其他的东西?
答案 0 :(得分:6)
做任何使API最清晰的事情。如果调用者只需要枚举它,您可以公开为IEnumerable<T>
,但我不会担心将其暴露为ReadOnlyCollection
。您可以只使用索引器和枚举器声明自定义类型(接口或类),当然
答案 1 :(得分:3)
如果是我,我会将其公开为
IEnumerable<IState>
答案 2 :(得分:2)
IEnumerable<T>
是一个不错的选择。
这是最小的合同,它仍然是一个序列,可以帮助你保持解耦。
它可以在Linq中为对象提供丰富的操作集合,因此您可以为消费者提供强大的功能。
答案 3 :(得分:2)
在某些情况下,如果只允许人们在列表上运行,我会使用IEnumerable<IState>
。但是,如果我需要一些外部世界的内置功能,如索引运算符,Count,Contains,IndexOf等,我会给它们ReadOnlyCollection
作为IList
并在文档中写入它是只读的。