为啥不在 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&lt;T&gt; 的使用意味着实现细节,而你意味着暴露一些更抽象的东西,例如IEnumerable&lt;T&gt;ICollection&lt;T&gt;,它们只代表您想要公开的功能(例如可枚举、可变和/或可索引)。这使您可以灵活地在以后更改实现。

在实践中,此警告通常通过返回 IList&lt;T&gt; 而不是 List&lt;T&gt; 来解决,但其想法是提示您思考“我实际上 需要什么功能 保证我的来电者?”例如。也许我应该返回 IEnumerable&lt;T&gt;ReadOnlyCollection&lt;T&gt;,因为我不希望我的调用者弄乱返回的集合。

【讨论】:

【参考方案2】:

始终公开对象层次结构中适合您的场景的最低基类/接口。例如,如果该属性的消费者只打算对其进行迭代,请使用IEnumerable(Of T)。通过公开List&lt;T&gt;,您通过让客户端代码访问您的类的实现细节来破坏封装。

【讨论】:

【参考方案3】:

通用列表是一种 .NET 结构,但 Web 服务通常旨在与其他框架互操作。

【讨论】:

为什么? “Web 服务通常旨在与其他框架互操作。” 请阅读。不是最好的解释,但它确实回答了原因。 不,我没有,你想要我吗? Web 服务通常被设计为可互操作,以便在集成异构系统时用作松散耦合的 RPC 机制。 +1 不得不考虑一下,但我明白你在说什么。 但是该列表将仅作为字符串列表通过肥皂发送,重新使用 webmethod 使用的女巫收集类/接口。

以上是关于为啥不在 VB.NET 的 web 服务的参数中暴露 List(Of String)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从VB.NET Web表单调用我的第一个WCF服务中的函数会引发错误。函数调用缺少WCF函数中的参数

C# 等效于 VB.NET 接口实现

vb.net如何动态调用WebService接口啊

处理 VB.NET 中的 varbinary 字段

使用多值 Web 服务,vb.net

如何使用 XmlNode() 作为 VB.NET 中 web 服务的结果?