【发布时间】:2017-12-23 04:54:43
【问题描述】:
关于 SO 已经有几个类似的问题,但我发现没有一个问题真正涉及到这个特定主题,所以就在这里......
我的理解是,应该始终尝试通过具体类返回接口。不会深入探讨其背后的原因,关于这方面的内容已经很多了。
但是对于 IReadOnlyCollection 与 ReadOnlyCollection 的情况,我不确定是否应该遵循该规则。
IReadOnlyCollection 可以轻松转换为 List,这...嗯...打破合同承诺的ReadOnly 方面。
ReadOnlyCollection 但是不能转换为List,但这意味着返回一个具体的类。
从长远来看,这真的重要吗?在我看来,在大多数情况下ReadOnly*/IReadOnly* 对象仅由方法或只读属性返回。
因此,即使用户决定将其转换为其他东西(在 IReadOnly* 对象的情况下)或使用 LINQ 从中创建某种集合(在 ReadOnly* 对象的情况下),暴露ReadOnly*/IReadOnly* 对象的类真的不可能接受它。
那么这里的建议是什么,返回一个IReadOnly* 接口还是一个具体的ReadOnly* 类实例?
【问题讨论】:
-
当您承诺返回
IReadOnlyCollection<T>并返回List<T>时,您害怕发生什么? -
“演员”问题是不切实际的...例如 LINQ 返回大量
IEnumerable<T>但每个人都调用ToList来获得列表表示。这是调用者的错,该方法只承诺IReadOnlyCollection<T>。顽皮的调用者甚至可以使用反射来破解IReadOnlyCollection<T>的内部内容,但这是他们的问题。