为啥不在 VB.NET 的 web 服务的参数中暴露 List(Of String)? [复制]
Posted
技术标签:
【中文标题】为啥不在 VB.NET 的 web 服务的参数中暴露 List(Of String)? [复制]【英文标题】:Why not expose List(Of String) in the parameters of web service in VB.NET? [duplicate]为什么不在 VB.NET 的 web 服务的参数中暴露 List(Of String)? [复制] 【发布时间】:2009-12-09 06:38:56 【问题描述】:可能重复:C#: Difference between List<T> and Collection<T> (CA1002, Do not expose generic lists)
FxCop 规定通用列表不应暴露给外界。
但我不明白为什么以及什么是通用列表的替代品?
参考:http://msdn.microsoft.com/en-in/library/ms182142%28en-us%29.aspx
【问题讨论】:
【参考方案1】:原因是具体的List<T>
的使用意味着实现细节,而你意味着暴露一些更抽象的东西,例如IEnumerable<T>
或ICollection<T>
,它们只代表您想要公开的功能(例如可枚举、可变和/或可索引)。这使您可以灵活地在以后更改实现。
在实践中,此警告通常通过返回 IList<T>
而不是 List<T>
来解决,但其想法是提示您思考“我实际上 需要什么功能 保证我的来电者?”例如。也许我应该返回 IEnumerable<T>
或 ReadOnlyCollection<T>
,因为我不希望我的调用者弄乱返回的集合。
【讨论】:
【参考方案2】:始终公开对象层次结构中适合您的场景的最低基类/接口。例如,如果该属性的消费者只打算对其进行迭代,请使用IEnumerable(Of T)
。通过公开List<T>
,您通过让客户端代码访问您的类的实现细节来破坏封装。
【讨论】:
【参考方案3】:通用列表是一种 .NET 结构,但 Web 服务通常旨在与其他框架互操作。
【讨论】:
为什么? “Web 服务通常旨在与其他框架互操作。” 请阅读。不是最好的解释,但它确实回答了原因。 不,我没有,你想要我吗? Web 服务通常被设计为可互操作,以便在集成异构系统时用作松散耦合的 RPC 机制。 +1 不得不考虑一下,但我明白你在说什么。 但是该列表将仅作为字符串列表通过肥皂发送,重新使用 webmethod 使用的女巫收集类/接口。以上是关于为啥不在 VB.NET 的 web 服务的参数中暴露 List(Of String)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章