首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

返回ICollection <T>而不是List <T>的真正好处是什么?

返回ICollection <T>而不是List <T>的真正好处是,它允许更广泛的灵活性和更好的代码解耦。

首先,ICollection <T>是一个更通用的接口,它提供了一组基本的集合操作,如添加、删除和检查元素等。这意味着,如果你返回ICollection <T>,那么使用你的代码的其他开发人员可以使用任何实现了ICollection <T>接口的集合类型。这可以带来更好的解耦,因为你的代码不会紧密地耦合到特定的集合实现。

其次,返回ICollection <T>而不是List <T>可以提高代码的性能。这是因为,ICollection <T>接口允许集合类型以不同的方式实现,这些实现可能比List <T>更适合某些操作。例如,一些集合类型可能具有更快的添加或删除操作,或者它们可能具有更好的内存管理。通过返回ICollection <T>,你允许使用你的代码的其他开发人员可以选择最适合他们需求的集合类型。

最后,返回ICollection <T>而不是List <T>可以提高代码的可维护性。这是因为,它允许你更轻松地更改集合实现,而不会影响到使用你代码的其他开发人员。例如,如果你发现一个更高性能的集合实现,你可以将其用于替换当前实现,而不会破坏任何使用你代码的其他开发人员的代码。

总之,返回ICollection <T>而不是List <T>的真正好处是更广泛的灵活性、更好的代码解耦、更高的性能和更好的可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C#集合类型大盘点

俗话说知其然,知其所以然,平常看到IEnumerable,IEnumerator,ICollection不是知道他们之间各自区别?除了List和Dictionary以外,你还用过哪些其它集合类?...实际上也是如此,我们可以说ICollection比IEnumerable多支持一些功能,不仅仅只提供基本遍历功能,还包括: 统计集合和元素个数 获取元素下标 判断是否存在 添加元素到未尾 移除元素等等...ICollectionICollection 略有不同,ICollection不提供编辑集合功能,即Add和Remove。包括检查元素是否存在Contains也不支持。...我们可以这样说,IEnumerable支持功能最少,只有遍历。ICollection支持功能稍微多一点,不仅有遍历还有维护这个集合功能。IList是最全版本。...List LinkedList HashSet SortedSet Stack Queue List   泛型List 类提供了不限制长度集合类型,List

1K70

.NET面试题系列 - IEnumerable派生类

注意,Stack和Queue没有继承ICollection,这是因为ICollection拥有Add,Remove等方法,栈和队列是不能随便添加删除元素。...最常见实现了IList数据结构是List。但其并不是链表。它内部实现是数组。靠链表实现数据结构是LinkedList。 List 在大多数情况下,这都是默认列表选择。...Linked list (LinkedList):当元素数量不是固定,且存在大量列表头尾添加动作时。否则使用 List。...Resizable array list (List):当元素数量不是固定,并且需要使用索引器时。  ...它又有两个主要派生类Array和ListList内部实现是一个数组不是链表。LinkedList才是C#链表实现。LinkedList不实现IList接口。

1.7K20

编写高质量代码改善C#程序157个建议

如果要实现一个自定义集合类,最好不要以List作为基类,而应该扩展相应泛型接口,通常是Ienumerable和ICollection(或ICollection子接口,如...> 不过,遗憾是继承List并没有带来任何继承上优势,反而丧失了面向接口编程带来灵活性,而且可能不稍加注意,隐含Bug就会接踵至。...一旦确实需要新迭代需求,完全可以创建一个新迭代器来满足需求,不是为集合设置该迭代器,因为这样做会直接导致使用到该集合对象其他迭代场景发生不可知行为。 其二:现在,我们有了LINQ。...一般情况下,如果集合属性没有值,则它返回Count等于0,不是集合属性值为null。...由于集合属性是一个引用类型,当前针对该属性对象引用却有两个,即集合本身和调用者类型变量list

55730

.net源码分析 – List

通过分析源码可以更好理解List工作方式,帮助我们写出更稳定代码。...泛型部分基本是上面这些接口泛型实现,不过IList一些操作放到ICollection里了,可能微软也觉得对于集合一些操作放到ICollection更合理吧。..._items就是存List元素数组了,List也是基于数组实现。 _size指元素个数。...如果不是ICollection,不过由于是IEnumerable,所以可以遍历,一个一个加到_items里。 属性 Count 返回是_size,这个是元素实际个数,不是数组大小。...List不是线程安全,需要我们自己用锁搞定, IsReadOnly也是false, 那为什么要继承IReadOnlyList呢,是为了提供一个转换成只读List机会,比如有的方法不希望传进来

70180

C#语言各种集合介绍

接口,所以任何集合类对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口对象,这个返回IEnumerator对象既不是集合类对象,也不是集合元素类对象...中表示集合行为接口有: 1)ICollection 定义所有集合大小、枚举数和同步方法。...、不是强类型 2)BitArray 实现了接口:ICollection、IEnumerable 管理位值压缩数组。...方法,得到IEnumerator对象,来遍历堆栈中各个元素 3.上面提到几种集合类,他们都是通用集合类,他们所接受元素大都是Object类型,当对象放入 了集合之后,都失去了原有的类型信息-即这些通用集合类都不是强类型...O(log n) 随集合中元素增加增加,每个元素需要增加时间不是线性,而是呈对数曲线。

59221

c#数组简单知识补充

,有索引器,查询元素位置,插入数据,移除索引位置数据这个方法,简单可以当作存放数据容器,不能像List那样具有很多数据处理方法。...System.Collections.IList // 集合父基类,定义了返回元素数量,复制等一些集合类型最基本方法,同时提供了可以同步访问ICollection对象元素方法,数组具有这些能力 System.Collections.ICollection...*/ System.Collections.Generic.IList // 提供泛型能力,也有基本增删改查功能 System.Collections.Generic.ICollection...System.Collections.Generic.IEnumerable // 只读list,通过索引访问该只读list元素 System.Collections.Generic.IReadOnlyList...,该数组对象会实现泛型接口,可以拥有linq查询能力,但当不是一维数组时,此时数据就不具有linq能力,此时数组对象不实现泛型接口。

13310

C#学习笔记 常用集合

列表List 列表List实现了IList、ICollection、IEnumberable、IList接口。可以向该列表中动态添加、删除、查找元素。...列表实现了IList接口,IList接口中实现了索引器。因此列表可以直接使用索引器访问元素,就像数组一样。 可以用Count属性查看列表有多少个元素。...队列Queue 队列也就是先进先出(FIFO)列表,队列实现了ICollection和IEnumberable接口,但是没有实现ICollection接口,因此没有Add()和...队列常用方法和属性如下: 方法或属性说明Count返回队列元素个数Enqueue该方法在队列末尾添加一个元素Dequeue该方法返回并删除队列头元素Peek该方法仅返回队列头元素,不删除元素TrimExcess... 前面的列表List是用数组实现

25410

dotnet 双缓存数据结构设计 下载库文件写入缓存框架

此时能做到网络下载使用集合和文件写入集合不是相同一个集合,因此两部分速度差异将不会相互影响 这个文件下载库在 GitHub 完全开源,欢迎小伙伴点击 Star 和参与开发 dotnet-campus...更多是这个下载库是通过 NuGet 库方式,可以让你在其他项目里面引用这个库 可以使用下面代码给项目添加下载库引用 dotnet add package dotnetCampus.FileDownloader...因此想要这个类足够通用,就需要让集合使用 ICollection 让上层可以注入 因此具体放元素是不需要关注,因此可以作为上层注入,也就是这个类有两个泛形 /// ...但是这里存在一个坑,也就是返回 T 不能被保存,只能用一次,同时也禁止多线程同时调用 上面代码切换缓存方法只能使用一个线程调用,同步调用。...因为在返回之前 if (buffer.Count == 0) 判断时候,也许此时又有其他线程加入了任务。

52020

.NET中泛型集合

我通常倾向于将接口作为方法和属性返回类型,不是保证一个特定实现类。在API中公开易变集合之前,你也应该深思熟虑,特别是当集合代表是对象或类型状态时。...所有这些操作返回都是链表中节点不是节点值;如果链表是空(empty),这些属性将返回空(null)。...尽管如此,还是有必要了解一下,以便知道它们不是什么。图B-2展示了三个接口间以及和IEnumerable接口关系。...此外,IReadOnlyList协变性意味着它不能暴露任何以T为参数方法,如Contains和IndexOf。其最大好处在于它暴露了一个索引器,通过索引来获取项。...当然未来还会有其他数据结构添加进来,但要在其好处与添加到核心框架中代价之间做出权衡。也许未来我们会看到明确基于树API,不是像现在这样使用树作为已有集合实现细节。

15620

金三银四面试:C#.NET面试题中高级篇3

IList 接口与List区别是什么? 2.泛型主要约束和次要约束是什么? 3. 如何把一个array复制到arraylist里? 4.数组和 list 和 arraylist 区别? 5....8.一个整数List中取出最大数(找最大值)。不能用Max方法。 9. C#异常类返回哪些信息? 10. 如何创建一个自定义异常? IList 接口与List区别是什么?...IList 泛型接口是 Icollection 接口子代,并且是所有非泛型列表基接口。Ilist 实现有三种类别:只读、固定大小、可变大小。无法修改只读 Ilist。... IList IList11 =new List (); 只是想创建一个基于接口IList对象实例,只是这个接口是由List实现。所以它只是希望使用到IList接口规定功能而已。...对于一个泛型,可以有0到无限次要约束,次要约束规定了实参必须实现所有的次要约束中规定接口。次要约束与主要约束语法基本一致,区别仅在于提供不是一个引用类型而是一个或多个接口。

1.4K40

为什么实现 .NET ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?

虽然泛型版本 ICollection 已经改进了设计,不再引入 SyncRoot 这样属性到接口中,但如果我们在某些场景下需要实现 ICollection 非泛型集合时,如何正确实现 SyncRoot... ICollection 接口中 SyncRoot 属性在接口中必然是公开,于是没有任何途径可以保证调用方不会发生死锁。...结合 .NET Core 源代码中一些常用写法,我给出一个推荐 SyncRoot 模式写法: // Is this List synchronized (thread-safe)?...=> this; 嗯,没错,返回了 this,这是各种同步时绝对不应该使用对象。...然而这个属性都是 public 了,不管返回什么,与 this 还有什么区别…… 关于为什么同步时不应该返回 this 或者返回公开对象,原因可以看我另一篇博客: 为什么不应该公开用来同步加锁对象

80130

最全数据结构详述: List VS IEnumerable VS IQueryable VS ICollection VS IDictionary

本文对常用数据结构详述:Array, ArrayList,List,IList,ICollection, Stack, Queue, HashTable, Dictionary, IQueryable...因此操作栈中数据,需要先将数据push 到栈顶部,需要删除元素必须变成栈顶部,即要遵守后进先出(LIFO)原则。 栈与哈希表一样既不是强类型也不限制元素个数。 ?...,遵循规则是先进先出(FIFO),既不是强类型也不具有固定大小限制。...ICollection 继承了IEnumberable,但是IEnumberable是基于索引ICollection不基于索引。 ?...objQueue.ToArray(); 13: this.ListBoxQueue.DataBind(); Dictionary 及 IDictionary: Dictionary 可通用,哈希表不是通用

1.9K80

30分钟LINQ教程

(5)注意事项       你不能用var关键字声明一个变量不给它赋值       因为编译器无法推导出你这个变量是什么类型。...:           var arr = new List() { 1, 2, 3, 4, 5, 6 };     (3)优点       我个人认为:这个特性不是那么amazing,       ...但你并不知道这个参数和返回是什么类型,       如果没有泛型,你可能把参数和返回类型都设定为Object了       那时,你心里肯定在想:反正一切都是对象,一切基类都是Object       ...(3)泛型好处       算法重用         想想看:list类型排序算法,对所有类型list集合都是有用       类型安全       提升性能         ...来看看List类型签名:           public class List : IList, ICollection, IEnumerable, IList, ICollection

71120
领券