我很困惑我应该从我的公共API方法和属性返回哪种集合类型.
我想到的收藏品是IList,ICollection和Collection.
返回其中一种类型总是优先于其他类型,还是取决于具体情况?
试图在这里运行一个项目的运行代码分析,并得到一些警告说,像这样:
CA1002:Microsoft.Design:在' SomeClass.SomeProtectedOrPublicProperty '中更改'List < SomeType > '以使用Collection,ReadOnlyCollection或KeyedCollection
我为什么要用Collection<T>而不是List<T>?当我查看msdn文档时,它们看起来几乎相同.在阅读了警告的错误帮助后,我发现了
System.Collections.Generic.List(T)_是一个通用集合,专为性能而非继承而设计,因此不包含任何虚拟成员.
但这究竟意味着什么呢?我应该做什么呢?
我应该继续在List<T>内部使用,然后在属性中返回一个new Collection<T>(someList)而不是?或者我应该开始使用Collection<T>而不是List<T>?
我已经看到它们以很多相同的方式使用了,我担心如果我不能更好地理解这一点,我将要走上一条不可逆转的设计之路.另外,我正在使用.NET.
使用IEnumerable<T>返回类型有问题吗?FxCop抱怨返回List<T>(它建议返回Collection<T>).
好吧,我一直受到一条规则的指导:"尽可能接受,但要回报最大值".
从这个角度来看,返回IEnumerable<T>是一件坏事,但是当我想使用"懒惰检索"时我该怎么办?此外,yield关键字是如此的好.
我需要设计自己的自定义GenericCollection类.现在我有很多选择使用以获得它IEnumerable,ICollection和IList,在后来提供了一些附加功能.
我很困惑,如果我和我一起去,IEnumerable<T>我可能需要声明对象实际上像这种情况一样持有集合_list.
public class GenericCollection<T> : IEnumerable<T>
{
private List<T> _list;
//...
}
Run Code Online (Sandbox Code Playgroud)
但是如果我使用ICollection<T>或者IList<T>,我不需要声明List对象,因为它是隐式可用的.
public class GenericCollection<T> : IList<T>
{
// no need for List object
//private List<T> _list;
//...
}
Run Code Online (Sandbox Code Playgroud)
这两种方法在性能方面有何不同?
在哪种情况下,每个人都是首选,特别是在设计自己的集合时.我对轻量级收藏感兴趣,性能良好.我认为这可以通过使用,IEnumerable<T>但是如何与一些强有力的理由一起使用呢?
我已经审查了一些现有的帖子,但没有提供所需的信息.
我读过一些博客文章提到,对于公共API,我们应该总是返回ICollection(或IEnumerable)而不是List.返回ICollection而不是List的真正优势是什么?
谢谢!
C#中Collection和List有什么区别?我的意思是我应该使用哪一个作为导航属性:
public Collection<OrderDetail> OrderDetails { get; set; }
Run Code Online (Sandbox Code Playgroud)
或者
public List<OrderDetail> OrderDetails { get; set; }
Run Code Online (Sandbox Code Playgroud) 可能重复:
集合<T>与列表<T>您应该在接口上使用什么?
考虑这个方法 - 返回的变量myVar是a List<T>,但方法的返回类型MyMethod()是IEnumerable<T>:
public IEnumerable<T> MyMethod(string stuff)
{
var myVar = new List<T>();
//do stuff
return myVar;
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想知道的是,如果返回myVar另一种类型是好的.
具体来说,就我的情况而言,'do stuff'通过a DataRow并将其中的项目分配给DataRow对象列表.我在其他地方也有类似的情况ICollection和IList返回类型.
我想要返回的原因IEnumerable或是ICollection因为我没有返回超过需要.但与此同时,这允许调用者将返回值转换为a,List如果需要这样做的话.
但是,我的return语句返回a List而不是方法的返回类型似乎很奇怪.这是正常做法吗?这样做有什么不对吗?
澄清(回应重复评论):
只是为了澄清,我很好奇的是,如果它是好的,在我的身体return语句返回一个List<T>,但这种方法管器具有返回类型的IEnumerable,或可能ICollection,Collection等...的东西不同比高于机构退货声明.
我应该IEnumerable<T>只在懒惰评估的情况下从方法和属性返回吗?
你有任何人的模式,当你返回IEnumerable,ICollection和IList?
这似乎是一项微不足道的任务,但我找不到怎么做(而且不知道该怎么称呼它).
例.我需要的state是实际上只是字符串列表的类.它必须如此工作:
state s = new state();
s.Add("John Madden");
//s[0] == "John Madden"
Run Code Online (Sandbox Code Playgroud)
我需要向这个类添加一些方法.
c# ×9
collections ×6
.net ×4
ienumerable ×4
icollection ×2
enumeration ×1
generics ×1
ilist ×1
list ×1
oop ×1
return ×1
return-type ×1