时间:2021-05-19
集合 表示一组可用于获取和存储的对象,在 C# 中提供了两种类型的集合。
前者存在于 System.Collections 命名空间下,属类型不安全的,后者存在于 System.Collections.Generic 命名空间下,属类型安全的。
不可变对象 定义为一旦创建就不可变更的对象, 在 .NET Core 中就存在着这三大 IReadOnlyList,IReadOnlyDictionary 和 IReadOnlyCollection 不可变集合,这篇文章我们就来讨论这些不可变集合以及在C#中如何使用。
IReadOnlyCollection 表示一个只读集合的基础接口,它实现了 IEnumerable 接口,代码定义如下:
publicinterfaceIReadOnlyCollection<outT>:IEnumerable<T>,IEnumerable{intCount{get;}}IReadOnlyDictionary 表示一个字典的只读形态,它实现了基础的只读集合接口 IReadOnlyCollection, 下面的代码展示了如何将 泛型字典 只读化。
publicIReadOnlyDictionary<string,string>Dictionary{get;}=newDictionary<string,string>{{"1","ABC"},{"2","XYZ"},{"3","PQR"},};IReadOnlyList 表示一个列表的只读形态,值得注意的是 只读集合 只能通过 index 访问,如下代码所示:
[DefaultMember("Item")]publicinterfaceIReadOnlyList<outT>:IEnumerable<T>,IEnumerable,IReadOnlyCollection<T>{Tthis[intindex]{get;}}接下来我们看一下如何使用 IReadOnlyList 替换 List 来实现列表的只读化,考虑下面的类。
publicclassAuthor{publicintId{get;set;}publicstringFirstName{get;set;}publicstringLastName{get;set;}}假如你想从数据库中返回 author 集合,使用如下代码:
publicstaticList<Author>GetAuthors(){returnnewList<Author>{newAuthor{Id=1,FirstName="Joydip",LastName="Kanjilal"},newAuthor{Id=2,FirstName="Steve",LastName="Smith"}};}为了简化,我省略了对数据库繁琐的操作,下面的代码展示了如何在 Main 方法中调用 GetAuthors() 方法。
staticvoidMain(string[]args){varauthors=GetAuthors();Console.Read();}显而易见上面的这种 authors 集合是我们用的最多的可变集合,那现在的问题是如何阻止 authors 被修改呢?这里就可以使用 IReadOnlyList 来确保 GetAuthors() 方法返回的集合不可更变,做法就是将方法的返回值从 List<Author> 修改为 IReadOnlyList<Author>,如下代码所示。
publicstaticIReadOnlyList<Author>GetAuthors(){returnnewList<Author>{newAuthor{Id=1,FirstName="Joydip",LastName="Kanjilal"},newAuthor{Id=2,FirstName="Steve",LastName="Smith"}};}接下来看一下 Main 下的 authors 是否有可添加的 Add() 方法?如下图所示:
不知道大家可否发现,现存的只读接口都继承了 IEnumberable,这就意味着 IEnumberable 也是一种只读形态,如果你只需要对集合进行迭代,那么就可以使用 IEnumberable 接口啦,如下代码所示:
publicvoidMyMethod(IEnumerable<Author>authors){foreach(Authorauthorinauthors){//Writeyourcodehere}}如果需求不满足,可以对 IEnumerable 继续向下转型,比如想对集合进行索引访问,那么可以转成 IReadOnlyList 接口,尽量满足 可用功能的最小化 ,改造后的代码如下:
publicvoidMyMethod(IReadOnlyList<Author>authors){intcount=authors.Count;for(intindex=0;index<count;index++){varauthor=authors[index];//Writeyourcodehere}}IEnumerable 是 .NET 较早版本可用于只读集合形态的接口, 在 .NET Core 中提供了新的只读接口可用于阻止集合的修改,不过值得注意的是,这些对数据提供只读视图的接口,本质上来说也仅仅是高层的封装而已。
以上就是如何在C#中使用只读的 Collections的详细内容,更多关于C#中使用只读的 Collections的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C#中如何定义全局变量及在各窗体中使用全局变量。usingSystem;usingSystem.Collections.Generic;usingSyste
本文实例讲述了C#通过oledb访问access数据库的方法。分享给大家供大家参考。具体分析如下:这里演示了如何在C#中使用MicrosoftAccess数据库
众所周知C#提供Async和Await关键字来实现异步编程。在本文中,我们将共同探讨并介绍什么是Async和Await,以及如何在C#中使用Async和Awai
1如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问JavaScript的已有变量?4.如何在C#中访问J
问:1.如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问JavaScript的已有变量?4.如何在C#中