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.mzph.cn/news/855437.shtml

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

相关文章

零信任是对抗AI威胁的“解药”

人工智能的变革力量正在重塑众多行业的业务运营。通过机器人流程自动化&#xff08;RPA&#xff09;&#xff0c;人工智能正在将人力资源从重复的、基于规则的任务中解放出来&#xff0c;并将其重点放在战略性的、复杂的操作上。此外&#xff0c;人工智能和机器学习算法可以以前…

数据库 |试卷1试卷2

1.数据库语言四大语句 4.四大类&#xff08;DDL、DML、DQL、DCL&#xff09;_中度ddl-CSDN博客 数据定义&#xff08;data defination language&#xff09; 查询、创建、删除、使用 #查询所有数据库 show databases;#查询当前数据库 select database();#创建数据库 create …

C++ 65 之 模版的局限性

#include <iostream> #include <cstring> using namespace std;class Students05{ public:string m_name;int m_age;Students05(string name, int age){this->m_name name;this->m_name age;} };// 两个值进行对比的函数 template<typename T> bool …

如何掌握 Java 中的安全机制,如权限控制和加密解密

Java是一门具有强大安全功能的编程语言&#xff0c;它内置了多种安全机制&#xff0c;包括权限控制、加密解密、认证授权等。 一、权限控制 权限控制是Java安全模型的重要组成部分&#xff0c;它主要通过Java安全管理器&#xff08;Security Manager&#xff09;和权限&#…

Python 数据可视化 多色散点图

Python 数据可视化 多色散点图 fig, ax plt.subplots() max_line max([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) min_line min([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) ax.plot([min_line, max_line], [min_line, …

【系统架构设计师】三、数据库系统(事务并发|封锁协议|数据库安全|商业智能|SQL语句)

目录 一、事务并发 1.1 事务概述 1.2 并发控制 1.3 封锁 1.3.1 X 封锁和 S 封锁 1.3.2 三级封锁协议 二、数据库安全 2.1 备份(转储)与恢复 2.2 备份分类 2.3 数据库故障 三、商业智能 3.1 数据仓库 3.2 数据仓库的结构-OLAP 3.3 数据挖掘 3.4 分布式数据库 四…

GD32错误调试篇:串口通讯乱码/stm32移植到GD32后串口通讯乱码等问题

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布&#xff1a; https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

小程序分页新写法

// pages/query/query.js import {request } from ../../utils/request; Page({/*** 页面的初始数据*/data: {tabClickIndex: ,page: 1,limit: 10,listData: []},/*** 生命周期函数--监听页面加载*/onLoad(options) {this.getList()},/*** 生命周期函数--监听页面初次渲染完成*…

【JS】上传文件显示文件的为空,显示的文件参数内容只有uid

上传的文件参数file里面只包含uid&#xff0c;没有其他信息 例子解决办法 例子 例如使用elment ui的el-upload组件上传文件&#xff0c;会导致上传的文件参数file里面只包含uid&#xff0c;没有其他信息&#xff0c;如图&#xff1a; 正确应为如下图&#xff1a; 解决办法 …

云上战场:ToDesk云电脑、青椒云、顺网云全面对决

前言 记得端午放假期间&#xff0c;我已经在旅游的路上了&#xff0c;老板突然发短信&#xff0c;让我给他画个图&#xff0c;我手上的战斗机已经是十年前的老古董了(平常一直用的公司电脑&#xff0c;也没想过要换)&#xff0c;压根满足不了老板的任务要求&#xff0c;不得已&…

WPF 程序 分布式 自动更新 登录 打包

服务器server端 core api 客户端WPF // 检查应用更新 //1、获取最新文件列表 // var files fileService.GetUpgradeFiles(); // 2、文件判断&#xff0c;新增的直接下载&#xff1b;更新的直接下载&#xff1b;删除的直接删除 // 客户端本地需要一个记录…

SpringMVC系列三: Postman(接口测试工具)

接口测试工具 &#x1f49e;Postman(接口测试工具)Postman介绍Postman是什么Postman相关资源Postman安装Postman快速入门Postman完成Controller层测试其它说明 &#x1f49e;课后作业 上一讲, 我们学习的是SpringMVC系列二: 请求方式介绍 现在打开springmvc项目 &#x1f49e…

2024年十大数据集成工具和软件应用场景解析

详细阐述了十大数据集成工具及其优缺点&#xff1a; 数据集成的挑战 在当今的商业环境中&#xff0c;企业常常面临着数据分散、系统孤立的难题。传统的数据集成方式&#xff0c;就像一张复杂的蜘蛛网&#xff0c;难以理顺&#xff0c;令人头痛不已。 数据孤岛: 各个业务系统独立…

【博士每天一篇文献-算法】Memory aware synapses_ Learning what (not) to forget

阅读时间&#xff1a;2023-12-13 1 介绍 年份&#xff1a;2018 作者&#xff1a;Rahaf Aljundi,丰田汽车欧洲公司研究员;阿卜杜拉国王科技大学(KAUST)助理教授;Marcus Rohrbach德国达姆施塔特工业大学多模式可靠人工智能教授 会议&#xff1a; Proceedings of the European c…

系统学习PLC

1.OB组织块 程序循环 PC ob1执行一次 ob123也执行一次 是 statup是程序启动的是第一个周期先执行starup&#xff08;0b100&#xff09;然后在执行ob1和0b123.这二个循环&#xff0c;周期执行这二个循环。1000是1s 2.DB块 建立指定数据块可以直接建立自己喜欢的类型 3.FB与…

【八股系列】介绍React高阶组件,适用于什么场景?

文章目录 1. HOC的工作原理2. 返回的新组件3. 适用场景4. 注意事项5. 示例代码 React高阶组件&#xff08; Higher-Order Components&#xff0c;简称HOC&#xff09;是 React中一种高级的 复用组件逻辑的技术。 HOC自身不是 React API的一部分&#xff0c;而是基于 Reac…

为何云原生是未来?企业IT架构的颠覆与重构(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是云原生 2、云原生的背景和起源 背景 起源 关…

Android 查询及获取应用程序 Package 及 Acticity 名称的方法

一、通过命令查询和获取应用的Package及Acticity &#xff08;一&#xff09;通过命令查询应用包名及安装信息 以下是常用命令&#xff1a; 命令形式作用adb shell pm list packages查询系统中所有应用的包名adb shell pm list packages -s查询系统应用包名adb shell pm lis…

MySQL 函数

1、CURDATE()&#xff1a;返回当前的日期。 2、查询当前年月 SELECT DATE_FORMAT(CURDATE(),%Y-%m) AS year_month 3、当前日期添加 1 个月 INTERVAL 1 MONTH 4、查询近6个月的月份 SELECT DATE_FORMAT(CURDATE(),%Y-%m)AS year_month UNION SELECT DATE_FORMAT((CURDAT…

【网络安全学习】使用Kali做信息收集 -03- <综合侦察>

综合侦察涉及从多个来源收集和分析目标的信息&#xff0c;以了解其背景、特征、潜在漏洞和风险。 下面介绍一些在Kali中常用的综合侦察工具。 1.Dmitry 它是一个命令行工具&#xff0c;可以使用不同的选项来收集目标的各种信息。 Dmitry可以与whois服务和Netcraft服务结合使…