如何在 C# 中使用只读的 Collections

集合 表示一组可用于获取和存储的对象,在 C# 中提供了两种类型的集合。

  • 普通集合

  • 泛型集合

前者存在于 System.Collections 命名空间下,属类型不安全的,后者存在于 System.Collections.Generic 命名空间下,属类型安全的。

不可变对象 定义为一旦创建就不可变更的对象, 在 .NET Core 中就存在着这三大 IReadOnlyList,IReadOnlyDictionaryIReadOnlyCollection 不可变集合,这篇文章我们就来讨论这些不可变集合以及在C#中如何使用。

三大只读类型介绍

IReadOnlyCollection 表示一个只读集合的基础接口,它实现了 IEnumerable 接口,代码定义如下:

public interface IReadOnlyCollection<out T> : IEnumerable<T>, IEnumerable{int Count { get; }}

IReadOnlyDictionary 表示一个字典的只读形态,它实现了基础的只读集合接口 IReadOnlyCollection, 下面的代码展示了如何将 泛型字典 只读化。


public IReadOnlyDictionary<string, string> Dictionary { get; } = new Dictionary<string, string>{{ "1", "ABC" },{ "2", "XYZ" },{ "3", "PQR" },};

IReadOnlyList 表示一个列表的只读形态,值得注意的是 只读集合 只能通过 index 访问,如下代码所示:

[DefaultMember("Item")]public interface IReadOnlyList<out T> : IEnumerable<T>, IEnumerable, IReadOnlyCollection<T>{T this[int index] { get; }}

使用 IReadOnlyList 替换 List

接下来我们看一下如何使用 IReadOnlyList 替换 List 来实现列表的只读化,考虑下面的类。


public class Author
{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }
}

假如你想从数据库中返回 author 集合,使用如下代码:


public static List<Author> GetAuthors()
{return new List<Author>{new Author{Id = 1,FirstName = "Joydip",LastName = "Kanjilal"},new Author{Id = 2,FirstName = "Steve",LastName = "Smith"}};
}

为了简化,我省略了对数据库繁琐的操作,下面的代码展示了如何在 Main 方法中调用 GetAuthors() 方法。


static void Main(string[] args)
{var authors = GetAuthors();Console.Read();           
}

显而易见上面的这种 authors 集合是我们用的最多的可变集合,那现在的问题是如何阻止 authors 被修改呢?这里就可以使用 IReadOnlyList 来确保 GetAuthors() 方法返回的集合不可更变,做法就是将方法的返回值从 List<Author> 修改为 IReadOnlyList<Author>,如下代码所示。


public static IReadOnlyList<Author> GetAuthors()
{return new List<Author>{new Author{Id = 1,FirstName = "Joydip",LastName = "Kanjilal"},new Author{Id = 2,FirstName = "Steve",LastName = "Smith"}};
}

接下来看一下 Main 下的 authors 是否有可添加的 Add() 方法?如下图所示:

使用 IEnumberable 接口

不知道大家可否发现,现存的只读接口都继承了 IEnumberable,这就意味着 IEnumberable 也是一种只读形态,如果你只需要对集合进行迭代,那么就可以使用 IEnumberable 接口啦,如下代码所示:


public void MyMethod(IEnumerable<Author> authors)
{foreach (Author author in authors){//Write your code here}
}

如果需求不满足,可以对 IEnumerable 继续向下转型,比如想对集合进行索引访问,那么可以转成 IReadOnlyList 接口,尽量满足 可用功能的最小化 ,改造后的代码如下:


public void MyMethod(IReadOnlyList<Author> authors)
{int count = authors.Count;for(int index = 0; index < count; index++){var author = authors[index];//Write your code here}
}

IEnumerable 是 .NET 较早版本可用于只读集合形态的接口, 在 .NET Core 中提供了新的只读接口可用于阻止集合的修改,不过值得注意的是,这些对数据提供只读视图的接口,本质上来说也仅仅是高层的封装而已。

译文链接:https://www.infoworld.com/article/3610473/how-to-work-with-read-only-collections-in-csharp.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统和数据库的知识梳理(思维导图)

使用思维导图工具 freemind 提供下载 源码文件和 Java网页版 http://files.cnblogs.com/facingwaller/osanddb.rar

令人难以理解的软件工程师:几千行代码能搞定的为什么要写几万行?

一我们公司的 Windows 版软体已经有十多年的历史&#xff0c;经过历代工程师的整治之后&#xff0c;内容已经凌乱不堪。过去三个月&#xff0c;我找时间自己重写了整个主程序。原本数万行的程序&#xff0c;被我重写的只剩下数千行&#xff0c;功能不变&#xff0c;效能更好&am…

如何从 dump 文件中提取出 C# 源代码?

一&#xff1a;背景 相信有很多朋友在遇到应用程序各种奇葩问题后&#xff0c;拿下来一个dump文件&#xff0c;辛辛苦苦分析了大半天&#xff0c;终于在某一个线程的调用栈上找到了一个可疑的方法&#xff0c;但 windbg 常常是以 汇编 的方式显示方法代码的&#xff0c;可惜的是…

通信开源linux,Linux环境进程间通信

Linux环境进程间通信(一)http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.htmlLinux环境进程间通信(二): 信号(上)http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.htmlLinux环境进程间通信(二): 信号(下)http://www.ibm.com/developerworks/cn…

真人拳皇项目Alpha阶段的回顾——史经浩

经过一个多月艰辛的努力&#xff0c;我们小组终于在1/14按时发布了真人拳皇的alpha版。按照计划&#xff0c;这一周是总结过去这段时间的经验教训&#xff0c;为即将到来的beta阶段作准备。回顾刚刚过去的一个多月&#xff0c;从plan阶段的天马行空&#xff0c;到后来的逐渐降级…

在栈中压入一个字符串c语言,面试题 31:栈的压入、弹出序列

题目描述输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序&#xff0c;序列4,5,3,2,1是该压栈序列对应的一个弹出序列&#xff0c;但4,3,5,1,…

谈谈对IOC及DI的理解与思考

一、前言在实际的开发过程中&#xff0c;我们经常会遇到这样的情况&#xff0c;在进行调试分析问题的时候&#xff0c;经常需要记录日志信息&#xff0c;这时可以采用输出到控制台。因此&#xff0c;我们通常会定义一个日志类&#xff0c;来实现输出日志。定义一个生成验证的逻…

关于perl和shell的参数传递

Perl 1.命令行参数传递 *Perl **ARGV $_ARGV[0] $#ARGV为参数的个数-1 ($#array 只适用于array不适用%hash) *Shell $1 $2 参数个数$#(不用减1,是否可以用来判断是否有命令行参数&#xff1f;) 2.函数参数传递 *Perl **_ 传递了所有的函数参数。如果是对象中的方法。$_[0] 是…

NET问答:如何理解 IEnumerableT 和 IQueryableT

咨询区 stackoverflowuser&#xff1a;请问类型 IQueryable<T> 和 IEnumerable<T> 有什么异同&#xff1f;我应该使用哪一个而不是另一个&#xff0c;代码如下&#xff1a;IQueryable<Customer> custs from c in db.Customers where c.City "<Cit…

c语言实现字母转化为unicode码,用C语言实现中文到unicode码的转换

由于本人喜欢用Notepad编辑器&#xff0c;该编辑器的好处是小巧灵活&#xff0c;但是有几个地方做的不足&#xff0c;但是我都能够很好的采取相应的措施来替代&#xff0c;下面让我们看看Notepad有哪些地方的不足&#xff0c;进而采取怎样的措施。一&#xff1a;Notepad不能编译…

终于有人把云计算、大数据和人工智能讲明白了!

今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢&#xff1f;因为这三个东西现在非常火&#xff0c;并且它们之间好像互相有关系&#xff1a;一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成…

c语言程序设计新编教程答案钱雪忠,新编C语言程序设计教程

图书简介配套资源&#xff1a;电子课件、习题解答、源代码本书特色&#xff1a;★精选例题&#xff0c;引入了大量趣味性、游戏性应用实例&#xff0c;注重与加强程序阅读、参考、编写和上机调试实践的能力&#xff0c;重在编程思路的培养与训练。★概念清晰但不烦琐&#xff1…

***指定网站

1.***指定网站&#xff1b;查找SQL注入点&#xff1b;碰到网站地址是以asp&#xff1f;44.php&#xff1f;44.等结尾的动态网页注入大家自己在论坛搜索资料。关键词SQL。 这里讲些小经验&#xff0c;有的网页如http://www.***.com/article/today/265501.html大家知道以HTML结尾…

聊一聊如何在.NET Core中使用Nacos 2.0

前言 随着 nacos 2.0.0 正式发布&#xff0c;老黄这边也跟着发布了 1.0.2 版本的 nacos-sdk-csharp。下面简单聊一下相关的使用。纯 SDK 的使用 首先要安装 nuget 包<PackageReference Include"nacos-sdk-csharp" Version"1.0.2" />这里有一点要注意…

c语言格式字符If,C语言所有语句格式 C语言中的的if语句共有多少种格式?

导航&#xff1a;网站首页 >C语言所有语句格式 C语言中的的if语句共有多少种格式&#xff1f;C语言所有语句格式 C语言中的的if语句共有多少种格式&#xff1f;相关问题:匿名网友:1.if语句&#xff1a;if(Bool表达式)&#xff5b;如果表达式为true,执行此表达式&#xff5d;…

听说你刚转了Java?准备转回.NET吧!

牛年跳槽季如火如荼&#xff0c;敏锐点的小伙伴儿应该都留意到了&#xff0c;BAT新年都在招聘.NET。2020年11月份发布.NET5统一了七大应用方向&#xff0c;.NET6的2个预览版已经把Blazor升级、跨平台UI方案MAUI、CLR性能优化等都放出来了&#xff0c;.NET前景充满想象&#xff…

poj2253

dijkstra 把存最短距离的数组改为存储frog distance即可 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std;const int maxn 201, inf 1000000000;struct point {int x, y;…

一个人开始废掉的3种迹象

1作家李尚龙说&#xff1a;“在大城市里&#xff0c;搞废一个人的方式特别简单。给你一个安静狭小的空间&#xff0c;给你一根网线&#xff0c;最好再加一个外卖电话。好了&#xff0c;你开始废了。”之前的我并不相信人会这么轻易地堕落&#xff0c;直到身边出现了一个真实的例…

WPF 动态更换图片路径

wpf中动态修改图片路径&#xff0c;其实很简单&#xff0c;有个小伙伴有疑问&#xff0c;绑定了source,为什么不能显示图片呢。。。通过绑定&#xff0c;修改图片路径&#xff0c;动态显示图片&#xff0c;效果如下&#xff1a;图片支持本地路径和网络路径&#xff0c;下面就来…

信管专业c语言考什么,计算机信息管理专业卫生事业单位招聘考试笔试模拟题(十)...

关于计算机信息管理专业卫生事业单位招聘考试笔试模拟题&#xff0c;相信很多人都想知道&#xff0c;医学教育网经过搜集整理&#xff0c;特别整理以下内容&#xff0c;希望对您有帮助&#xff01;1、题干&#xff1a;广域网一般采用网状拓扑构型&#xff0c;该构型的系统可靠性…