C# Unity 面向对象补全计划 之 索引器与迭代器

         本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正

        本篇有部分内容出自唐老狮,唐老师网站指路:全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho

目录

1.索引器

 2.迭代器


 

1.索引器

        我的理解 索引器就是一个对象内数据结构属性, 像普通属性一样是一个语法糖

       可以让 对象 像数组一样访问 对象内的集合元素 看一下就知道怎么用了

        来一个C#版本的看看语法

public class StudentList
{private string[] students = new string[5];// 定义索引器 其中index代表外界索引的标志 返回值则是你的数据结构的类型public string this[int index]{get => students[index];set => students[index] = value;}
}// 使用索引器
StudentList list = new StudentList();
list[0] = "Alice";  // 设置值
Console.WriteLine(list[0]); // 输出 "Alice"(获取值)

        要知道索引器不仅可以封装对象数组 还可以封装List 字典等等 

        来一个Unity版本的:

        C#下 泛型的 ,其实上面那个就是Unity 泛型的

public class CustomListWrapper<T>
{private List<T> _items = new List<T>();// 索引器public T this[int index]{get => _items[index];set => _items[index] = value;}// 添加元素的方法public void Add(T item) => _items.Add(item);
}// 使用
var listWrapper = new CustomListWrapper<string>();
listWrapper.Add("A");
listWrapper[0] = "B";  // 通过索引器修改值
Console.WriteLine(listWrapper[0]); // 输出 "B"

 2.迭代器

        允许对象支持 foreach 遍历 就已经实现了迭代器 作用为按需生成序列值(延迟执行),不需要知道其内部逻辑结构

        foreach的本质就是利用迭代器做迭代 ,借用唐老狮笔记:

        自己写迭代器 只需要注意三点:

        1 继承IEnumeratble(可选)

        2 实现GetEnumerator(必须)

        3 继承IEnumerator(必须)

        其内部就是一个可移动的"光标",每次MoveNext以后返回为true就让currentIndex+=1

using System;
using System.Collections;class MyCollection
{private int[] data = { 1, 2, 3, 4, 5 };public MyEnumerator GetEnumerator(){return new MyEnumerator(this);}public class MyEnumerator : IEnumerator{private MyCollection collection;private int currentIndex = -1;public MyEnumerator(MyCollection collection){this.collection = collection;}public object Current{get{if (currentIndex < 0 || currentIndex >= collection.data.Length){throw new InvalidOperationException();}return collection.data[currentIndex];}}public bool MoveNext(){currentIndex++;return currentIndex < collection.data.Length;}public void Reset(){currentIndex = -1;}public void Dispose(){// 在这里进行资源清理相关操作,比如关闭文件、释放连接等// 对于简单示例这里可以不做具体操作}}
}class Program
{static void Main(){MyCollection myCollection = new MyCollection();MyCollection.MyEnumerator enumerator = myCollection.GetEnumerator();while (enumerator.MoveNext()){Console.WriteLine(enumerator.Current);}enumerator.Dispose();}
}

        使用yield return直接替代了IEnumerator中这几个方法

using System;
using System.Collections.Generic;class MyEnumerable
{private int[] data = { 1, 2, 3, 4, 5 };public IEnumerable<int> GetEnumerator(){for (int i = 0; i < data.Length; i++){yield return data[i];}}
}class Program
{static void Main(){MyEnumerable myEnumerable = new MyEnumerable();foreach (int num in myEnumerable.GetEnumerator()){Console.WriteLine(num);}}
}

         总体来说 是不需要自己实现但是需要知道的知识

 

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

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

相关文章

深度学习PyTorch之13种模型精度评估公式及调用方法

深度学习pytorch之22种损失函数数学公式和代码定义 深度学习pytorch之19种优化算法&#xff08;optimizer&#xff09;解析 深度学习pytorch之4种归一化方法&#xff08;Normalization&#xff09;原理公式解析和参数使用 深度学习pytorch之简单方法自定义9类卷积即插即用 实时…

C++ Primer 拷贝控制和资源管理

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

【无监督学习】层次聚类步骤及matlab实现

层次聚类 &#xff08;四&#xff09;层次聚类1.算法步骤2.MATLAB 实现参考资料 &#xff08;四&#xff09;层次聚类 层次聚类是一种通过逐层合并或分裂数据点构建树状结构&#xff08;树状图&#xff0c;Dendrogram&#xff09;的聚类方法。它分为两种类型&#xff1a; 凝聚…

02 HarmonyOS Next仪表盘案例详解(一):基础篇

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 1. 项目概述2. 技术架构2.1 文件结构2.2 ArkTS 语言特性装饰器的使用 3. 数据结构设计3.1 接口定义3.2 数据初始化 4. 生命周期与页面路由…

微信小程序接入deepseek

先上效果 话不多说&#xff0c;直接上代码&#xff08;本人用的hbuilder Xuniapp&#xff09; <template><view class"container"><!-- 聊天内容区域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…

istio入门到精通-2

上部分讲到了hosts[*] 匹配所有的微服务&#xff0c;这部分细化一下 在 Istio 的 VirtualService 配置中&#xff0c;hosts 字段用于指定该虚拟服务适用的 目标主机或域名。如果使用具体的域名&#xff08;如 example.com&#xff09;&#xff0c;则只有请求的主机 域名与 exa…

6. PromQL的metric name(在node exporter复制下来交给AI解释的)

目录 前言&#xff1a; Go 运行时指标&#xff1a; Go 内存统计指标&#xff1a; CPU 指标&#xff1a; 内存指标&#xff1a; 磁盘指标&#xff1a; 网络指标&#xff1a; 系统指标&#xff1a; 前言&#xff1a; 写这个得目的是为了后续方便查询&#xff0c;因为在pro…

图像形成与计算机视觉基础

1. 图像形成的基本原理 图像形成是物理世界与传感器&#xff08;如胶片、CCD/CMOS&#xff09;交互的过程&#xff0c;核心是光线的传播与记录。 1.1 直接放置胶片模型 物理原理&#xff1a;物体表面反射的光线直接照射到胶片上&#xff0c;但无任何遮挡或聚焦机制。 问题&a…

Dockerfile概述及编辑

文章目录 Docker 镜像原理操作系统组成部分Docker 镜像原理镜像制作 Dockerfile概念及作用Dockerfile 概念Dockerfile 作用 Dockerfile关键字 案例要求实现步骤 Docker 镜像原理 操作系统组成部分 操作系统组成&#xff1a;进程调度子系统、进程通信子系统、内存管理子系统、…

CES Asia 2025:AR/VR/XR论坛峰会备受瞩目

CES Asia 2025第七届亚洲消费电子技术贸易展&#xff08;赛逸展&#xff09;将在首都北京心盛大举行。作为亚洲极具影响力的消费电子技术展会&#xff0c;此次盛会以“科技重塑生活&#xff0c;创新定义未来”为主题&#xff0c;预计将吸引全球500展商、100,000专业观众参与&am…

【Java线程基础操作详解】

Java线程基础操作详解 前言1. 线程创建1.1 继承Thread类1.2 实现Runnable接口1.3 匿名内部类1.4 lambda表达式 2. 线程中断3. 线程等待4. 线程休眠 前言 在Java编程里&#xff0c;线程是实现多任务处理的关键概念。本文会详细讲解Java中线程的创建、中断、等待以及休眠等操作&…

qt 播放pcm音频

一、获取PCM音频 ffmpeg -i input.mp3 -acodec pcm_s16le -ar 44100 -ac 2 -f s16le output.pcm -acodec pcm_s16le&#xff1a;指定16位小端PCM编码格式&#xff08;兼容性最佳&#xff09;-ar 44100&#xff1a;设置采样率为CD标准44.1kHz&#xff08;可替换为16000/8000等&a…

python实现的可爱卸载动画

在逛掘金时&#xff0c;掘金用户在B站看到的灵感进行的一个卸载窗口的动画效果的实用案例。人类是一种不断在学习的动物&#xff0c;并且是一种模仿能力学习能里比较强的动物。我这里是第三波的学习实践者咯&#xff01; 相对VUE构建动画效果窗口&#xff0c;我更加喜欢用pytho…

出现FullGC的排查思路

一、明确Full GC的触发原因 根据多篇资料&#xff0c;Full GC的触发条件主要包括&#xff1a; 直接调用System.gc()&#xff1a;代码或第三方库&#xff08;如jxl组件&#xff09;可能显式触发。老年代空间不足&#xff1a;大对象直接进入老年代、Minor GC后存活对象过多导致…

【Python运维】 Python与日志管理:构建高效的集中式日志收集与分析系统

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在当今信息化时代,日志数据成为企业监控系统健康、优化性能和保障安全的重要资源。传统的分散式日志管理方式不仅效率低下,而且难以应对大…

给没有登录认证的web应用添加登录认证(openresty lua实现)

这阵子不是deepseek火么&#xff1f;我也折腾了下本地部署&#xff0c;ollama、vllm、llama.cpp都弄了下&#xff0c;webui也用了几个&#xff0c;发现nextjs-ollama-llm-ui小巧方便&#xff0c;挺适合个人使用的。如果放在网上供多人使用的话&#xff0c;得接入登录认证才好&a…

静态成员不依赖于特定对象的内容

静态成员不依赖于特定对象的内容这一概念主要涉及到面向对象编程中的静态成员&#xff08;包括静态变量和静态方法&#xff09;。为了详细解释这一点&#xff0c;我们需要从以下几个方面来理解&#xff1a; 1. 面向对象编程基础 在面向对象编程中&#xff0c;类是对象的蓝图&…

SQL Server查询计划操作符(7.3)——查询计划相关操作符(9)

7.3. 查询计划相关操作符 78)Repartition Streams:该操作符消费多个输入流并产生多个输出流。期间,记录内容与格式保持不变。如果查询优化器使用一个位图过滤(bitmap filter),则输出流中的数据行数将会减少。一个输入流的每行记录被放入一个输出流。如果该操作符保留顺序…

【Java学习】异常

一、异常的处理过程 异常类的似复刻变量被throw时&#xff0c;会立即中止当前所在的这层方法&#xff0c;即当层方法里throw异常类似复刻变量之后的语句就不会执行了&#xff0c;如果throw异常语句在当层方法中被try{}包裹&#xff0c;则中止就先发生被包裹在了try{}层&#xf…

政务信息化项目审计全解析:核心重点与区域实践差异化破局

随着数字化转型加速&#xff0c;政务信息化项目审计已成为提升政府治理效能的关键环节。本文系统梳理审计核心维度&#xff0c;并结合多地差异化实践案例&#xff0c;揭示如何通过精准审计赋能智慧政务建设。 一、审计八大核心维度&#xff1a;穿透信息化项目全生命周期 1. 项…