关于c#:使用List< T>的最佳方式

Best way of using List<T> and exposing Collection<T>

我必须实现一个公开值列表(整数、自定义类等)的Web服务。我的工作解决方案返回一个List,根据fxcop,最好返回一个CollectionReadOnlyCollection

如果我选择返回ReadOnlyCollection,Web服务会显示如下错误:

To be XML serializable, types which inherit from ICollection must have an implementation of Add(System.Int32) at all levels of their inheritance hierarchy.
System.Collections.ObjectModel.ReadOnlyCollection 1 [[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] does not implement Add(System.Int32).

您最喜欢在内部使用List和公开Collection的方法是什么?(使用C_,最好仅使用框架2.0)


在这种情况下,list或collection可以。

对于原始问题,您可以在集合中非常简单地包装一个列表

1
2
3
List<Foo> list = new List<Foo>();
// ...
Collection<Foo> col = new Collection<Foo>(list);

这是一个真正的包装器;向包装器(col)中添加一个项,然后将其添加到列表中。这可能有点令人困惑,因为许多这样的构造函数使用参数进行初始填充,但不链接到原始列表。collection是一个例外;-p

因为您在Web服务边界上,所以fxcop的建议不适用。这对于防止调用者踩踏被调用者的内存非常有用(与EricLippert最近的博客保持一致),但是在一个简单不适用的Web服务分布式场景中。事实上,由于Web服务在某些通用场景中存在一些有良好文档记录的问题,因此在Web服务边界上,一个简单的数组可以说是非常有用和实用的。在Eric的博客中-在本例中,没有关于呼叫者/被呼叫者问题的问题,因为这两者之间存在强制屏障。

就WSDL/MEX而言,我怀疑所有3个(列表/集合/数组)都将成为一个元素块——所以您可以选择最方便的元素。


我通常从wcf web服务返回ilist:fxcop对此非常满意。不确定这是否适用于ASMX Web服务。