gpt4 book ai didi

c# - IReadOnlyCollection 与 ReadOnlyCollection

转载 作者:太空狗 更新时间:2023-10-29 20:58:11 27 4
gpt4 key购买 nike

SO 上已经有几个类似的问题,但我发现没有一个真正涉及到这个特定主题,所以这里...

我的理解是,应该始终尝试通过具体类返回接口(interface)。不会深入探讨其背后的原因,已经有很多关于它的事情了。

但是在 IReadOnlyCollectionReadOnlyCollection 的情况下,我不确定是否应该遵循该规则。

IReadOnlyCollection 可以很容易地转换为 List,这...好吧...打破 ReadOnly 契约(Contract) promise 的方面。

ReadOnlyCollection 但是不能转换为 List,但它意味着返回一个具体类。

从长远来看,这真的很重要吗?在我看来,在大多数情况下 ReadOnly*/IReadOnly* 对象仅由方法或只读属性返回。

因此,即使用户决定将其转换为其他对象(在 IReadOnly* 对象的情况下)或使用 LINQ 从中创建某种集合(在ReadOnly* 对象),暴露ReadOnly*/IReadOnly* 对象的类实际上不可能接受它。

那么这里的建议是什么,返回一个IReadOnly* 接口(interface)还是一个具体的ReadOnly* 类实例?

最佳答案

IReadOnlyCollection<T>只能转换为 List<T>如果基础对象属于该类型。 ReadOnlyCollection<T>例如还实现了 IReadOnlyCollection<T> .

所以我的推荐,回IReadOnlyCollection<T>如果您担心调用者会错误地将其转换为不应该的类型,请确保基础类型为 ReadOnlyCollection<T>

public IReadOnlyCollection<User> GetUsers()
{
return new ReadOnlyCollection<User>();
}


但返回 IReadOnlyCollection<T>应该足以让函数的调用者理解它应该是只读的。
请注意,您永远无法使用ReadOnlyCollection<T> 来完全保护您的代码。 ,调用者仍然可以使用反射来访问内部列表并对其进行操作。
在这种情况下,唯一的选择是创建列表的副本并将其返回。

关于c# - IReadOnlyCollection 与 ReadOnlyCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45164799/

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