当前位置: 首页 > news >正文

C#中让字典、列表、数组作为只读的方法参考

一、字典

        在 C# 中,可以通过使用 ReadOnlyDictionary<TKey, TValue> 类或者是通过调用普通字典的 .AsReadOnly() 方法来创建一个只读的字典。ReadOnlyDictionary 不允许修改字典,任何试图改变字典的操作都会抛出 NotSupportedException

        以下是使用 ReadOnlyDictionary<TKey, TValue> 类来返回一个只读字典的例子:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;class Program
{static void Main(){// 创建一个可修改的字典Dictionary<int, string> modifiableDict = new Dictionary<int, string>();modifiableDict.Add(1, "One");modifiableDict.Add(2, "Two");modifiableDict.Add(3, "Three");// 创建一个只读字典ReadOnlyDictionary<int, string> readOnlyDict = new ReadOnlyDictionary<int, string>(modifiableDict);// 返回只读字典foreach (var kvp in readOnlyDict){Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");}// 任何试图修改 readOnlyDict 的操作都会抛出异常// readOnlyDict.Add(4, "Four"); // NotSupportedException}
}

        如果你想要创建并返回一个只读的字典,但不想引入 ReadOnlyDictionary<TKey, TValue> 的依赖,你可以定义一个返回 IReadOnlyDictionary<TKey, TValue> 的方法,例如:

public IReadOnlyDictionary<TKey, TValue> GetReadOnlyDictionary<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
{return new ReadOnlyDictionary<TKey, TValue>(dictionary);
}

        这样做的好处是你的方法签名不会显示具体的 ReadOnlyDictionary 类型,增强了代码的抽象化,只需知道返回的是一个不可变的字典接口。当然,实际返回的依然是 ReadOnlyDictionary 实例。调用者仅能通过 IReadOnlyDictionary 接口暴露的成员来使用这个字典,而不是 ReadOnlyDictionary 类的成员。

二、列表

        在 C# 中,要返回一个只读的列表,可以使用 ReadOnlyCollection<T> 类,或者使用 LINQ 扩展方法 ToList().AsReadOnly() 来将一个 List<T> 转换为 IReadOnlyList<T>。这样的列表对外部是不可变的,即不允许增加、删除或修改元素。

        下面是如何使用 ReadOnlyCollection<T> 来创建只读列表的例子:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;public class Program
{public static void Main(){// 创建一个可变的列表List<int> modifiableList = new List<int> { 1, 2, 3 };// 创建一个只读的列表ReadOnlyCollection<int> readOnlyList = new ReadOnlyCollection<int>(modifiableList);// 使用只读列表foreach (var item in readOnlyList){Console.WriteLine(item);}// 任何试图修改 readOnlyList 的操作都会抛出异常// readOnlyList[0] = 10;  // NotSupportedException// readOnlyList.Add(4);    // NotSupportedException}
}

        在上面的代码中,我们首先创建了一个包含三个元素的 List<int> 对象。然后我们将这个列表传递给 ReadOnlyCollection<int> 的构造函数,这样创建了一个只读的列表 readOnlyList。这个只读列表包装了原始的列表,但是不提供任何修改该列表的方法。这意味着,尝试对 readOnlyList 进行任何修改都会导致运行时抛出异常。

        如果需要返回符合 IReadOnlyList<T> 接口的只读列表,可以使用下面的方法:

public IReadOnlyList<T> GetReadOnlyList<T>(IList<T> list)
{return new ReadOnlyCollection<T>(list);
}

使用这种方式,你可以保持代码对返回类型的抽象,同时确保在任何情况下列表都是只读的。

三、数组

        在C#中,数组(T[])是一个定长的数据结构,其大小在创建时被确定,并且不能被动态地增长或收缩。要想返回一个只读的数组,你可以返回数组的一个拷贝,客户代码可以自由地修改这个数组的副本,而不会影响原始数组。

        以下是创建一个数组并返回其副本的示例代码:

public class ArrayExample
{private int[] _numbers;public ArrayExample(){_numbers = new[] {1, 2, 3, 4, 5}; // 初始化数组}public int[] GetNumbers(){// 返回原始数组的一个副本return (int[])_numbers.Clone();}
}

        在这个例子中,GetNumbers 方法使用 Clone 方法来创建 _numbers 数组的一个完整拷贝,并将其返回。在这种情况下,调用者可以对返回的数组副本进行任何操作,而不会影响原始数组。

        请注意,这种方法只适用于数组包含的是值类型(比如 intdoublechar 等)或不可变的引用类型(比如 string)。如果数组包含可变的引用类型,那么即使返回数组的副本,数组内部的对象仍然是可以被修改的。在这种情况下,你可能需要进行更深层次的拷贝(深拷贝),例如拷贝数组中每个对象的副本而不仅仅是引用。

        如果你想要确保原始数组不能被修改,你还可以使用 Array.AsReadOnly 方法将数组转换为 ReadOnlyCollection<T>,但是请注意这个方法不会返回数组类型,而是返回实现了IReadOnlyList<T> 和 IReadOnlyCollection<T>接口的只读集合。

public ReadOnlyCollection<int> GetReadOnlyNumbers()
{// 返回只读集合封装的原始数组return Array.AsReadOnly(_numbers);
}

        使用上述方法,用户可以访问原始数组的元素,但不能修改集合。这是一个返回原始数组只读视图的好方法,但请注意调用者得到的返回类型不是数组本身,而是封装数组的 ReadOnlyCollection<T> 对象。

相关文章:

C#中让字典、列表、数组作为只读的方法参考

一、字典 在 C# 中&#xff0c;可以通过使用 ReadOnlyDictionary<TKey, TValue> 类或者是通过调用普通字典的 .AsReadOnly() 方法来创建一个只读的字典。ReadOnlyDictionary 不允许修改字典&#xff0c;任何试图改变字典的操作都会抛出 NotSupportedException。 以下是使…...

深入理解 React 中的 children props 和 render props

深入理解 React 中的 children props 和 render props 在 React 中&#xff0c;children props 和 render props 是两种常见的组件复用模式&#xff0c;它们都可以帮助我们更好地组织和复用组件代码。虽然它们的实现方式有所不同&#xff0c;但都能够有效地实现组件之间的数据…...

前端日期组件layui使用,月模式

初学前端&#xff0c;实战总结 概要 有一个日期组件&#xff0c;我的谷歌浏览器选完日期后&#xff0c;偶尔获取不到最新数据&#xff0c;有一个客户&#xff0c;是经常出不来数据。 日期组件是Wdate&#xff1a;调用的方法是WdatePicker onpicking&#xff0c;代码片段如下…...

Rust编程(四)PackageCrateModule

这一部分的中文教程/文档都很混乱,翻译也五花八门,所以我建议直接看英文官方文档,对于一些名词不要进行翻译,翻译只会让事情更混乱,本篇从实战和实际需求出发,讲解几个名称的关系。 Module & Crate & Package & Workspace 英文中的意思: Cargo:货物 Crate:…...

命名空间【C++】(超详细)

文章目录 命名空间的概念命名空间的定义命名空间定义的位置作用域每一个命名空间都是一个独立的域作用域符&#xff1a;&#xff1a; 编译器找一个变量/函数等的定义&#xff0c;寻找域的顺序为什么要有命名空间&#xff1f;1.解决库与程序员定义的同名的重定义问题2.解决程序员…...

OceanBase OBCA 数据库认证专员考证视频

培训概述 OceanBase 认证是 OceanBase 官方推出的唯一人才能力认证体系&#xff0c;代表了阿里巴巴及蚂蚁集团官方对考生关于 OceanBase 技术能力的认可&#xff0c;旨在帮助考生更好地学习 OceanBase 数据库产品&#xff0c;早日融入 OceanBase 技术生态体系&#xff0c;通过由…...

卷积神经网络(CNN)——基础知识整理

文章目录 1、卷积神经网络 2、图片格式 3、图片卷积运算 4、Kernel 与 Feature Map 5、padding/边缘填充 6、Stride/步长 7、pooling/池化 8、shape 9、epoch、batch、Batch Size、step 10、神经网络 11、激活函数 1、卷积神经网络 既然叫卷积神经网络&#xff0c;这里面首先是…...

2024四川省赛“信息安全管理与评估“--网络事件响应--应急响应(高职组)

2024四川省赛“信息安全管理与评估“(高职组)任务书 2024四川省赛“信息安全管理与评估“任务书第一阶段竞赛项目试题第二阶段竞赛项目试题任务 1 应急响应(40分)第三阶段竞赛项目试题2024四川省赛“信息安全管理与评估“任务书 第一阶段竞赛项目试题 先略 第二阶段竞赛…...

Java类与对象:从概念到实践的全景解析!

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;javaSE的修炼之路 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、类的定义格式 在java中定义类时需要用到…...

MySQL与SQLite区别

MySQL和SQLite都是关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它们都使用SQL&#xff08;结构化查询语言&#xff09;作为标准查询语言。然而&#xff0c;尽管它们共享许多共同点&#xff0c;但它们在语法、功能、性能和存储机制方面存在一些差异。 以下是…...

【社会救助管理系统】主要设计及拟采用的技术方案

主要设计及拟采用的技术方案 1. 主要设计&#xff08;1&#xff09;系统架构设计&#xff08;2&#xff09;功能设计&#xff08;3&#xff09;安全性设计 2. 设计思想&#xff08;1&#xff09;系统架构设计思想&#xff08;2&#xff09;功能设计思想&#xff08;3&#xff0…...

视频素材库哪个软件好?这8个高清无版权的素材网推荐

小伙伴们在制作短视频的时候&#xff0c;是不是为找素材发愁呢&#xff1f;一个高质量的无水印视频对创作者的帮助太大了&#xff0c;而且还需要无版权可商用的&#xff0c;那究竟有没有这样的网站呢&#xff1f;今天我来告诉大家。 1&#xff0c;蛙学府&#xff08;中国&…...

GEE23:基于植被物候实现农作物分类

地物分类 1. 写在前面2. 北京作物分类 1. 写在前面 今天分享一个有意思的文章&#xff0c;用于进行农作物分类。文章提出了一个灵活的物候辅助监督水稻(PSPR)制图框架。主要是通过提取植被物候&#xff0c;并自动对物候数据进行采样&#xff0c;获得足够多的样本点&#xff0c;…...

一些常见的Docker问题和答案

什么是Docker&#xff1f;它的主要功能是什么&#xff1f; Docker是一种开源的容器化平台&#xff0c;用于构建、部署和运行应用程序。它的主要功能包括&#xff1a;快速构建、分发和运行应用程序的容器化环境&#xff0c;实现应用程序的可移植性和可扩展性。 Docker和虚拟机…...

Web CSS笔记2

目录 1、背景 ①、背景图片(image) ②、背景平铺&#xff08;repeat&#xff09; ③、背景位置(position) ④、背景附着&#xff08;attachment&#xff09; ⑤、背景透明(CSS3) ⑥、背景图片缩放大小&#xff08;size&#xff09;&#xff1a; ⑦、背景简写 2、标签显…...

SpringBoot -- 整合SpringMVC

SpringBoot已经替我们整合了许多框架并进行了默认的配置&#xff0c;我们只需要在依赖中导入spring-boot-starter-web&#xff0c;就可以直接使用SpringMVC以及web场景下的已经整合好的功能。但SpringBoot的默认配置可能无法满足我们所有的需求&#xff0c;那么我们怎么进行自定…...

C语言操作符详细讲解

前言 本次博客一定会让刚刚学习C语言小白有所收获 本次操作符讲解不仅分类还会有代码示例 好好看 好好学 花上几分钟就可以避免许多坑 1 操作符的基本使用 1.1操作符的分类 按功能分 算术操作符&#xff1a; 、- 、* 、/ 、% 移位操作符: >> << 位操作符…...

Godot 学习笔记(5):国际化多语言翻译,包含常用10种语言机翻!

文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言 为了面向更大的市场&#xff0c;国际化是肯定…...

服务器大请求体问题定位

背景 整个系统,分位微服务A、微服务B,A在调用B的过程中,报400BadRequest,问题定位到修复后,如何发送一个同样的请求进行验证 解决过程 1、查询A服务的日志,发现在调用B的过程中报错400BadRequest,并且请求体非常大300多KB 2、查看B服务的日志,发现请求没有进来 3、发…...

Vue指令之v-model

调了半天没反应&#xff0c;结果是没引用Vue&#xff0c;我是伞兵。 v-model的作用是将视图与数据双向绑定。一般情况下&#xff0c;Vue是数据驱动的&#xff0c;即数据发生改变后网页就会刷新一次&#xff0c;更改对应的网页内容&#xff0c;即数据单向绑定了网页内容。而使用…...

Evo FPGA伺服控制库:基于xlr8_servo硬件IP的兼容封装

1. 项目概述evo_servo是一个专为 Evo 系列 FPGA 开发板设计的伺服电机控制封装库&#xff0c;其核心定位是为 Evo 平台提供对 XLR8 平台xlr8_servo模块的兼容性访问能力。该库并非从零构建的全新驱动&#xff0c;而是对已有硬件加速逻辑的功能性桥接层&#xff08;wrapper&…...

西门子TIA V18仿真避坑指南:从编译报错到PG/PC接口丢失的完整解决方案

西门子TIA V18仿真避坑指南&#xff1a;从编译报错到PG/PC接口丢失的完整解决方案 在工业自动化领域&#xff0c;西门子TIA Portal&#xff08;Totally Integrated Automation Portal&#xff09;作为行业标杆的工程软件平台&#xff0c;其V18版本带来了更强大的仿真功能。然而…...

华为交换机VRRP实战:用eNSP模拟一个部门隔离、主备网关自动切换的企业网

华为eNSP实战&#xff1a;VRRP高可用网关设计与故障模拟全解析 当市场部的同事正在视频会议时突然断网&#xff0c;而技术部的代码提交也因网络抖动失败——这类因单点故障引发的业务中断&#xff0c;在企业网中绝非个例。本文将用华为eNSP模拟器&#xff0c;带您构建一个具备毫…...

OpenClaw技能市场盘点:10个适配Qwen3.5-4B-Claude的实用模块

OpenClaw技能市场盘点&#xff1a;10个适配Qwen3.5-4B-Claude的实用模块 1. 为什么需要关注技能市场&#xff1f; 去年冬天&#xff0c;当我第一次在本地部署OpenClaw时&#xff0c;最让我惊喜的不是框架本身&#xff0c;而是它背后那个不断生长的技能市场。作为一个长期被重…...

AI图像放大神器Upscayl:告别模糊时代的终极解决方案

AI图像放大神器Upscayl&#xff1a;告别模糊时代的终极解决方案 【免费下载链接】upscayl &#x1f199; Upscayl - Free and Open Source AI Image Upscaler for Linux, MacOS and Windows built with Linux-First philosophy. 项目地址: https://gitcode.com/GitHub_Trendi…...

AnythingLLM文档处理革命:如何用统一接口解析20+文件格式构建智能知识库

AnythingLLM文档处理革命&#xff1a;如何用统一接口解析20文件格式构建智能知识库 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型…...

2026年3月26隔夜暗盘挂单排行榜

推荐好文:每年节约五六千交易费不香吗如何获取龙虎榜是否有量化参与如何获取股东减持信息大A有5400多只股票, 这里面只有不到10%, 约500只由资金投票, 剩余的都是杂毛, 炒股看龙头找主线. 从隔夜挂单里选择, 再叠加我们之前分享的如何判断是否有大股东减持, 是否有融资融券参与…...

3分钟让静态图像“活“起来:AI肖像动画技术全解析

3分钟让静态图像"活"起来&#xff1a;AI肖像动画技术全解析 【免费下载链接】LivePortrait Bring portraits to life! 项目地址: https://gitcode.com/GitHub_Trending/li/LivePortrait 静态图像如何突破二维平面的限制&#xff0c;展现动态生命力&#xff1f…...

OpenClaw技能开发入门:为百川2-13B模型定制专属文件处理插件

OpenClaw技能开发入门&#xff1a;为百川2-13B模型定制专属文件处理插件 1. 为什么需要自定义文件处理技能&#xff1f; 去年夏天&#xff0c;我的桌面上堆积了超过2000份未分类的文档——包括技术笔记、会议记录、临时下载的论文和各种截图。当我尝试用现有工具整理时&#…...

如何用GPT-3.5的function calling功能对接理杏仁API获取金融数据(附完整代码)

金融数据智能对接实战&#xff1a;基于GPT-3.5函数调用与理杏仁API的深度整合 在金融科技领域&#xff0c;数据获取与处理的自动化一直是开发者关注的焦点。传统API对接往往需要编写大量固定逻辑的代码&#xff0c;而大语言模型的出现为这一流程带来了新的可能性。本文将深入探…...