C#迭代器及Unity协程实例解析
程序员文章站
2022-06-25 08:09:23
1、c#迭代器1.1、ienumerable和ienumeratorc#中的迭代器封装在ienumerable和ienumerator和他们的泛型接口中。ienumerable:定义了一个可以获取ie...
1、c#迭代器
1.1、ienumerable和ienumerator
c#中的迭代器封装在ienumerable和ienumerator和他们的泛型接口中。
ienumerable:定义了一个可以获取ienumerator的方法---getenumerator()。
//ienumerable的代码实现 public interface ienumerable { ienumerator getenumerator(); }
ienumerator:则在目标序列上实现循环迭代,直到不再需要数据。常见的foreach循环就是使用这个接口
//ienumerator的代码实现 public interface ienumerator { /// <summary> /// 获取当前的项(只读属性) /// </summary> object current { get; } /// <summary> /// 将游标的内部位置向前移动 /// </summary> /// <returns>是否成功</returns> bool movenext(); /// <summary> /// 将游标重置到第一个成员前面 /// </summary> void reset(); }
但是为什么会有两个接口呢?为什么不直接让ienumerable实现所有方法呢?
为了不违背单一职责原则。如果有几个嵌套的foreach循环,那么彼此就可能会收到影响了。
1.2、迭代器使用
c#中的数组和集合都是继承了ienumerable接口的,所以我们可以直接使用。
static void main(string[] args) { int[] arr = new int[5] { 12, 65, 749, 16, 49 }; //foreach (int item in arr) //{ // console.writeline(item); //} #region 和上面的foreach相同 ienumerator e = arr.getenumerator(); //获取要迭代的对象 while (e.movenext()) //一个一个的读取元素,读取完会返回false { console.writeline(e.current); //输出读取内容 } #endregion }
自定义类中使用迭代器。
/// <summary> /// 动物园类,里面有很多动物 /// </summary> public class zoo : ienumerable { animal[] animals = new animal[3]; public zoo() { animals[0] = new animal("张三"); animals[1] = new animal("李四"); animals[2] = new animal("赵五"); } public ienumerator getenumerator() { return this.animals.getenumerator(); } } /// <summary> /// 动物类,每个动物有其名字 /// </summary> public class animal { private string name; public string name { get { return name; } } public animal(string name) { this.name = name; } } static void main(string[] args) { zoo zoo = new zoo(); //可以直接使用foreach迭代 foreach (animal animal in zoo) { console.writeline(animal.name); } console.readkey(); }
2、unity中的协程
2.1、进程 线程 协程介绍
进程:
- 进程有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
- 进程是有独立功能的程序关于某个数据集合上的一次运行活动。
线程:
- 线程有自己独立的栈和共享的堆,共享堆,不共享栈。线程由操作系统调度。
- 一个进程可以包含多个线程。
- 线程异步运行,多处理器中多个线程可同时运行。
协程:
- 协程共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
- 协程执行在游戏主线程上,同一时间只能执行一个协程。
- 线程避免了无意义的调度,提高了性能,但需要程序员自己承担调度责任。
2.2、协程使用
unity的协程系统是基于c#的一个简单而强大的接口 ,ienumerator。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。