C# 索引器与迭代器分部类详情

文章目录

  • 一、迭代器
  • 二、查看Foreach执行中间语言
  • 三、foreach实现过程总结
  • 四、实现迭代器最常用的方法
  • 五、分布类概述及其使用
  • 六、索引器概述及声明
  • 七、索引器在类中的使用
  • 八、索引器在接口中的使用
  • 九、总结


一、迭代器

1、迭代器(iterator)解决的是集合访问的问题,提供一种方法顺序访问一个集合对象中的各个元素,而不暴露对象内部标识。迭代器还有一个别名:游标(cursor)
2、foreach语句与迭代器的关系:Foreach循环语句可以用来迭代枚举的集合中的所有元素,又称foreach迭代语句
3、可枚举的: C#中,如果某个类型继承了接口IEnumerable,或者继承了泛型接口IEnumerable或者继承了泛型接口IEnumerable的任何构造类型,那么久成这个类型时可枚举的
4、常见的可枚举类型:集合,数组,字符串类String,标识动态列表的泛型类List等
在这里插入图片描述
在这里插入图片描述
5、Foreach语句可以简化C#内置迭代器的使用复杂性,编译froeach语句,会生成调用GetEnumerator和MoveNext方法以及Current属性的代码,这些方法和属性恰是C#内置迭代器所提供的。
6、ILDASM外部工具的添加方法(中间语言反汇编的工具)
方法1:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

打开新添加的外部工具:

在这里插入图片描述

方法2
在这里插入图片描述
在这里插入图片描述

二、查看Foreach执行中间语言

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
中间语言: language
ILDASM: intermediate language decompile assembly
在这里插入图片描述

三、foreach实现过程总结

foreach语句是微软提供的支持内置迭代器的语句法糖,编译foreach语句后生产的代码与使用迭代器的代码完全一致
调用GetEnumerator()方法获得迭代器——调用IEnumerator.MoveNext()——调用IEnumerator.Current()

Foreach循环迭代可枚举类型的过程:

1、通过调用IEnumerator接口和IEnumerator的引用
2、IEnuerator调用MoveNext方法
3) ①True:IEnumerator的Current属性获取对象的应用,用于foreach循环
②false 结束
4、重复2、3步知道MoveNext返回false

四、实现迭代器最常用的方法

迭代器可用于方法、属性访问器或其他代码块,使用户能够在类或结构中支持Foreach迭代,而不必实现整个IEnumerable接口,只需要一个类型化的方法GetEnumerator(),不需要处理设计模式

1、迭代器是C#可以提供的最简单的设计模式。
2、设计模式(Design pattern/behavorial pattern)是一套被反复使用、多数人知晓的、经过分类编目的、典卖设计经验总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
3、.Net Framework有自己的IEnumerator接口,使用的迭代器的作用很明确,及可以做到不暴露集合的内部接口,又可让外部代码同名地方访问集合内部的数据。 2.1 创建迭代器最常用的方法 是对IEnumerable接口实现GetEnumerator方法创建最简单的迭代块说明:迭代器返回值类型必须为IEnumerable(迭代类成员)和IEnumerator(迭代类)一个迭代器会出现一个或者多个yield语句,与一般语句块的区别:yield return 一次返回迭代的下一个袁旭yield break 指出这个迭代的结束

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;            // 需要引用的命名空间
namespace 实现迭代器常用的方法
{class Program{public static IEnumerable SimpleDemo(){yield return "string1";yield return "string2";yield return "string3";yield break;  //运行到此处就终止了迭代yield return "string4";yield return "string5";}//月份迭代public class Months : IEnumerable        //为了使用Foreach遍历,要保证是可枚举类型的{string[] month = { "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Nov", "Dec" };public IEnumerator GetEnumerator(){for(int i=0;i<month.Length;i++){yield return month[i];}}}static void Main(string[] args){foreach (string item in SimpleDemo()){Console.WriteLine(item);}Months mon = new Months();foreach(string m in mon){Console.WriteLine(m);}Console.ReadKey();}}
}

五、分布类概述及其使用

分布类定义: 将类的定义拆分到两个或多个资源文件中。每个源文件包含类定义的一部分,编译应用程序时将把所有部分组合起来,这就是分布类。

应用场合(partial):
1、处理大型项目时,使一个类分布于多个独立文件中,可以让多位程序员同时对该类进行处理;
2、使用自动生成的源时,无需重新创建源文件便可将代码添加到类中。
vs在创建windows窗体和web服务包装代码等时都是用此方法。开发人员无须编译vs所创建的文件,即可创建使用这些类的代码。

实现过程:

1、通过多个部分来定义一个类
2、partial关键字:必须直接放在class的前面
3、分部类声明的每个部分都必须包含partial修饰符,并且器声明必须与其他部分位于同一命名空间。
4、partial修饰符说明在其他位置可能还有同一个类型声明的其他部分。但是这些其他部分并非必须存在:如果只有一个类型声明,包含partial修饰符也是有效的。
5、当分部类声明指定了可访问性(借助访问修饰符:public、protected、internal private)时,它必须与其他部分所指定的可访问性一致。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _3_分部类
{//利用分部类实现阶乘与幂指数运算partial class arithmetic    //阶乘{public int factorial(int num){int factorialval = 1;for(int i = num; i>0;i--){factorialval *= i;}return factorialval;}}partial class arithmetic //幂指数运算{public int power(int num, int index){int result = 1;for (int i = 0; i < index; i++){result *= num;}return result; }}class Program{static void Main(string[] args){arithmetic a = new arithmetic();int num = 5;Console.WriteLine("调用分部类的第一部分——阶乘计算结果:{0}", a.factorial(num));int index = 3;Console.WriteLine("调用分部类的第二部分——幂指函数计算结果:{0}", a.power(num, index));Console.ReadKey();}}
}

注意事项 :

1、分部类时,同一个类型各个部分的所有分部类类型定义都必须使用partial进行修饰,必须具有相同的可访问性。
2、同一个类型的各个部分的所有分部类型定义都必须在同一程序集合同一模块中进行定义。分部类定义不能跨越多个模块。
3、使用partial关键字表明可在命名空间内定义该类、结构或接口的其他部分,各个部分可以指定不同的基接口,最终类型将实现,所有分部声明所列出的全部接口。

六、索引器概述及声明

可以通过小标访问数组中的元素的方式就是索引器
索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器的声明和属性的声明非常相似,不同的是他们的访问器采用参数——索引器的声明除了包括索引关键字(index)的声明外,还包括this关键字。使得向数组那样对对象使用下标,并提供了通过索引方式方便第访问类的数据信息的方法。(属性的作用就是保护字段,对字段的取值和赋值进行限定)

虚拟索引器:virtual
外部索引器:extern 因为外部索引器声明不提供任何实际的实现,所以他的每个访问器生摩纳哥都由一个分号组成。
抽象索引器:abstract 当要定义为抽象索引器时,必须提供空的get和set,必须在抽象类中声明抽象索引器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _4_索引器概述及声明
{//属性声明public class Clerk{private string name;   //字段声明,专供类内部使用,所以声明为私有的public string Name     //属性为外部事务,可以供其他类进行交流使用,所以声明为公共的{get { return name; }set { name = value; }}private char gender;public char Gender{get{if (gender != '男' && gender != '女') gender = '男';return gender;}set{gender = value;}}//索引器声明1//private int[] myint = new int[10];//public int this[int index]//{//    get { return myint[index]; }   //单独存在为只读//    set { myint[index] = value; }  //单独存在为只写  ,两个同时存在为读写//}//声明一个虚拟的索引器//private int[] myint2 = new int[10];//public virtual int this[int index2]//{//    get { return myint2[index2]; }//    set { myint2[index2] = value; }//}// 声明一个外部索引器public extern int this[int index]{ get; set; }}// 抽象索引器声明abstract class indexEaxmple{public abstract int this[int index]{get;set;}}class Program{static void Main(string[] args){}}}

七、索引器在类中的使用

索引器允许用户按照处理数组的方式索引类,访问时有两种形式
使用索引器可直接访问类实例:将数组声明为public成员并直接访问它的成员;
实例:1、访问类实例(容量为10的整型数组为例)2、访问类成员(以星期演示)

using System;
namespace _5_索引器在类中的使用
{public class indexText //访问类的实例{private int[] array = new int[10];public int this[int index]{get{if (index < 0 || index > 10) return 0;else return array[index];}set{if (index >= 0 && index < 10) array[index] = value;}}}public class weekIndex //访问类成员{string[] week = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };private int getDay(string weekText){int i = 0;foreach(string day in week){if (day == weekText) return i+1;i++;}return -1;}public int this[string week]{get { return getDay(week); }}}class Program{static void Main(string[] args){Console.WriteLine("访问类实例的结果");indexText Arr = new indexText();Arr[-5] = 5;Arr[0] = 15;Arr[2] = 60;Arr[11] = 65;Console.WriteLine("Arr[-5]={0}", Arr[-5]);Console.WriteLine("Arr[0]={0}", Arr[0]);Console.WriteLine("Arr[1]={0}", Arr[1]);Console.WriteLine("Arr[2]={0}", Arr[2]);Console.WriteLine("Arr[11]={0}", Arr[11]);Console.WriteLine("访问累成员结果");weekIndex we = new weekIndex();Console.WriteLine(we["星期三"]);Console.WriteLine(we["星期四"]);Console.WriteLine(we["星期八"]);Console.WriteLine(we["星期0"]);Console.ReadKey();}}
}

八、索引器在接口中的使用

索引器可以作为接口成员来声明,单接口中的索引器声明不包括任何访问修饰符,这是因为接口不包括任何编程程序语句,所以get和set访问器没有程序主题,因此,访问索引器的用途是指示索引器时读写、只读还是只写

using System;
namespace _6_索引器在接口中的使用
{public interface iTextIndex{int this[int index]{get;set;}}class indexText:iTextIndex{// 演示容量为10的数组,对实例成员的访问private int[] array = new int[10];public int this[int index]{get{if (index < 0 || index >= 10) return 0;else return array[index];}set{if (index > 0 && index < 10) array[index] = value;}}}class Program{static void Main(string[] args){indexText Arr = new indexText();Arr[-1] = 5;Arr[4] = 10;Arr[9] = 20;Arr[14] = 30;for(int i=-1;i<15;i=i+5){Console.WriteLine("Arr[{0}]={1}", i, Arr[i]);}Console.ReadKey();}}
}

九、总结

索引器实现QQ状态的访问,利用类成员进行访问,得出QQ状态对应的索引值

using System;
namespace 本章小结及任务实施
{public class QQStateIndex{string [] qqState = { "在线", "离线", "忙碌", "Q我", "隐身" };private int getState(string stateText){int i= 0;foreach(string stateString in qqState){if (stateString == stateText) return i;i++;}return -1;}public int this[string stateString]{get { return getState(stateString); }}}class Program{static void Main(string[] args){QQStateIndex qs = new QQStateIndex();Console.WriteLine(qs["在线"]);Console.WriteLine(qs["忙碌"]);Console.WriteLine(qs["睡眠"]);Console.ReadKey();}}
}

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

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

相关文章

vue3+ts+vite集成eslint

项目中安装eslint yarn add eslint -Deslint初始化 npx eslint --init按照下方操作即可 安装typescript-eslint/parser yarn add typescript-eslint/parser -D安装vite-plugin-eslint2 yarn add vite-plugin-eslint2 -D配置vite-plugin-eslint2 // vite.config.ts import …

Linux系统编程——进程信号

目录 一&#xff0c;信号预备 1.1 生活中的信号 1.2 技术应用中的信号 1.3 signal函数捕捉信号 1.3 信号的发送与记录 1.4 信号的常见处理方式 二&#xff0c;信号的产生 2.1 核心转储 2.1.1 环境配置 2.1.2 利用core文件进行调试 2.1.3 core dump标志 2.2 通过系统…

所以spring mvc异常处理工作原理是啥

文章目录 spring mvc异常处理&#xff08;源码分析&#xff09;概述原理&#xff08;源码角度&#xff09;模拟debug前期提要分析4个map4个map的初始化为什么需要基于mappedMethods缓存 总结一下 spring mvc异常处理&#xff08;源码分析&#xff09; 概述 spring mvc有下面三…

127.0.0.1与本机IP地址的区别

大家好&#xff0c;今天我们来聊聊一个在网络世界中常常被提及&#xff0c;但可能对于非专业人士来说还有些模糊的概念——127.0.0.1与本机IP地址。这两个地址在网络通信中都扮演着重要的角色&#xff0c;但它们之间又有着怎样的区别呢&#xff1f;让我们一起来探究一下。 一、…

简单Mesh多线程合并,使用什么库性能更高

1&#xff09;简单Mesh多线程合并&#xff0c;使用什么库性能更高 2&#xff09;Unity Semaphore.WaitForSignal耗时高 3&#xff09;VS编辑的C#代码注释的中文部分乱码 4&#xff09;变量IntPtr m_cachePtr切换线程后变空 这是第389篇UWA技术知识分享的推送&#xff0c;精选了…

【GO-OpenCV】go-cv快速配置

最近对golang实现目标检测心血来潮&#xff0c;尝试在没有sudo权限的平台配置go-cv,有所发现&#xff0c;索性多个平台都做尝试 安装Go语言&#xff08;Golang&#xff09; 通过包管理器安装&#xff08;适用于Debian/Ubuntu&#xff09;(有点慢) 更新包列表&#xff1a; sud…

AbMole带你探索颅内压力与肌肉生长的联系:一项突破性研究

在生物医学领域&#xff0c;颅内压力&#xff08;ICP&#xff09;的调控机制一直是研究的热点。最近&#xff0c;一项发表在《PLOS ONE》上的研究为我们揭示了颅内压力与后颅窝肌肉生长之间的潜在联系&#xff0c;为我们理解某些慢性头痛的成因提供了新的视角。 颅内压力的异常…

大数据的发展,带动电子商务产业链,促进了社会的进步【电商数据采集API接口推动电商项目的源动力】

最近几年计算机技术在诸多领域得到了有效的应用&#xff0c;同时在多方面深刻影响着我国经济水平的发展。除此之外&#xff0c;人民群众的日常生活水平也受大数据技术的影响。 在这其中电子商务领域也在大数据技术的支持下&#xff0c;得到了明显的进步。虽然电子商务领域的发…

酷开科技将AI与大数据融合,成为OTT大屏营销革新的驱动力

在数字化浪潮的推动下&#xff0c;营销领域正经历着深刻的变革。而在这样一个媒介渠道分散、注意力碎片化的时代&#xff0c;“大屏”是难得能让消费者们“精神集中”高度卷入的内容消费场景&#xff0c;也是能让品牌一对多地高效触达家庭人群的通道&#xff0c;大屏的独特营销…

TVBOX 最新版下载+视频源教程

下载链接 wx 搜索 Geek 前端 发送电视资源进行获取 操作教程

【数据结构与算法】对称矩阵,三角矩阵 详解

给出对称矩阵、三角矩阵的节省内存的存贮结构并写出相应的输入、输出算法。 对称矩阵和三角矩阵可以通过特殊的存储结构来节省内存。这种存储结构只存储矩阵的一部分元素&#xff0c;而不是全部元素。 对称矩阵&#xff1a;对于一个n阶对称矩阵&#xff0c;我们只需要存储主对…

VUE 项目用 Docker+Nginx进行打包部署

一、Docker Docker 是一个容器化平台&#xff0c;允许你将应用程序及其依赖项打包在容器中。使用 Docker&#xff0c;你可以创建一个包含 Vue.js 应用程序的容器镜像&#xff0c;并在任何支持 Docker 的环境中运行该镜像。 二、Nginx Nginx 是一个高性能的 HTTP 服务器和反向…

钡铼技术BL104在环境监测站多协议采集保障数据全面准确

随着工业化和城市化进程的加快&#xff0c;环境污染问题日益严重&#xff0c;环境监测站在保护生态环境、保障公众健康中的作用变得越来越重要。钡铼技术PLC物联网关BL104&#xff0c;为环境监测站提供了一种高效、可靠的多协议数据采集解决方案&#xff0c;保障了监测数据的全…

Hype 4(html5工具) mac版下载-Hype 4 for mac软件最新版下载附加详细安装步骤

用户量向我们证明了矢量形状&#xff0c;矢量是使用矢量工具绘制的形状&#xff0c;包括直线&#xff0c;曲线和复杂形状。有目共睹的是Hype是一款强大的Mac OS平台 HTML5 创作工具&#xff0c;它能够在网页上做出赏心悦目的动画片效果&#xff0c;创建丰富的网页交互动画片&am…

域策略笔记

域策略 导航 文章目录 域策略导航一、设置客户端壁纸二、重定向用户配置文件路径三、部署网络打印机四、部署共享文件夹为网络驱动器五、通过域策略推送软件安装六、通过域策略限制软件的使用通过路径进行限制通过进程限制 七、通过域策略将文件添加白名单八、通过域策略添加可…

大数据集群离线解析经纬度逆编码地址

背景 最近有个需要需求把经纬度解析为地址&#xff0c;那么通常解析地址市面上流行的方案就是调取百度、高德地图的接口进行解析。 难点 但是在用这个方案遇到一个问题就是企业认证的百度地图每天的逆编码解析为300w次&#xff0c;qps为100次/秒&#xff0c;对于日增上千万的…

大数据实训项目(小麦种子)-03、大数据环境Hadoop、Mapreduce、Hive、Hbase、HDFS搭建服务及调试

文章目录 前言一、Linux系统Centos7安装配置JDK8二、Linxu系统Centos7中搭建Hadoop3.1.0服务下载地址服务1&#xff1a;详细步骤&#xff08;初始化与启动dfs服务&#xff09;详细步骤配置环境变量 服务2&#xff1a;Hadoop(YARN)环境搭建 三、Linux系统搭建Hive3.1.2服务前提条…

SysTools MailXaminer: 电子邮件取证调查中的链接分析和时间线分析

天津鸿萌科贸发展有限公司是 SysTools 系列软件的授权代理商。 SysTools MailXaminer 电子邮件取证软件提供全面强大的解决方案&#xff0c;通过简化的操作&#xff0c;从电子邮件客户端、网络邮箱服务器、磁盘镜像、Skype 通讯工具中解密并搜索证据。软件对调查工作的每一阶段…

基于 Transformer 的大语言模型

语言建模作为语言模型&#xff08;LMs&#xff09;的基本功能&#xff0c;涉及对单词序列的建模以及预测后续单词的分布。 近年来&#xff0c;研究人员发现&#xff0c;扩大语言模型的规模不仅增强了它们的语言建模能力&#xff0c;而且还产生了处理传统NLP任务之外更复杂任务…

这些已经死去的软件,依旧无可替代

互联网这条长河里&#xff0c;软件们就像流星一样&#xff0c;一闪而过。有的软件火过一段时间&#xff0c;然后就慢慢消失了。 说不定有些软件你以前天天用&#xff0c;但不知道从什么时候开始就不再用了。时间一天天过去&#xff0c;我们的热情、记忆都在消退&#xff0c;还…