C#迭代器及Unity协程实例解析

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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#使用yield关键字构建迭代器详解

    以前,如果我们希望构建支持foreach枚举的自定义集合,只能实现IEnumerable接口(可能还有IEnumerator()),返回值还必须是IEnumerator类型,除此之外还可以通过迭代器来使用构建foreach循环的类型,详细见下链接. 代码 public class Car { //内部状态数据 public int CurentSpeed; public int MaxSpeed; public string name; //汽车能不能用 private bool carIsde

  • C#特性-迭代器(上)及一些研究过程中的副产品

    提到迭代器我们不能不想到迭代器模式,那我就以迭代器模式作为开场白. 在我们的应用程序中常常有这样一些数据结构: 它们是一个数据的集合,如果你知道它们内部的实现结构就可以去访问它们,它们各自的内部存储结构互不相同,各种集合有各自的应用场合.说到这里大家可能想出一大堆这样的集合了:List,Hashtable,ArrayList等等.这些集合各自都有各自的个性,这就是它们存在的理由.但如果你想遍历它你必须知道它内部的存储细节,作为一个集合元素,把内部细节暴露出来肯定就不好了,这样客户程序就不够稳定了

  • C#迭代器模式(Iterator Pattern)实例教程

    本文以实例形式简单简述了C#迭代器模式的实现方法,分享给大家供大家参考.具体方法如下: 一般来说,迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种. 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些.把这些迭代动作封装到一个接口中. public interface IIterator { void First(); string Next(); bool IsDone(); string Current(); }

  • php和C#的yield迭代器实现方法对比分析

    本文实例讲述了php和C#的yield迭代器实现方法对比.分享给大家供大家参考,具体如下: yield关键字是用来方便实现迭代器的,免去了手工写迭代器的繁琐.迭代器常被用来实现协程,所以大部分的协程中都有yield关键字,可以参看unity3D的协程. C#版本: 函数的返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 IEnumerator<T>. IEnumerable表示一个类可以迭代,也就是可以用foreach遍历,IEnum

  • C#中使用迭代器处理等待任务

     介绍 可能你已经阅读 C#5 关于 async 和 await 关键字以及它们如何帮助简化异步编程的,可惜的是在升级VS2010后短短两年时间,任然没有准备好升级到VS2012,在VS2010和C#4中不能使用异步关键字,你可能会想 "如果我能在VS 2010中写看起来同步的方法,但异步执行.我的代码会更清晰." 看完这篇文章后,您将能够做到这一点.我们将开发一个小的基础结构代码,让我们写"看起来同步的方法,但异步执行"的方法,这个VS2012 异步关键字一样,

  • C#学习笔记整理-迭代器模式介绍

    什么是迭代器模式? 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 何时使用迭代器模式? 当需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,需要考虑使用迭代器模式. 迭代器模式的组成 Iterator:迭代器抽象类,用于定义得到开始对象,对到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口. ConcreteAggregate:保存聚合对象. ConcreteIterator:继承于Iterator,实现具体如何对聚

  • C#特性 迭代器(下) yield以及流的延迟计算

    从0遍历到20(不包括20),输出遍历到的每个元素,并将大于2的所有数字放到一个IEnumerable<int>中返回 解答1:(我以前经常这样做) static IEnumerable<int> WithNoYield() { IList<int> list = new List<int>(); for (int i = 0; i < 20; i++) { Console.WriteLine(i.ToString()); if(i > 2) l

  • C#迭代器及Unity协程实例解析

    1.C#迭代器 1.1.IEnumerable和IEnumerator C#中的迭代器封装在IEnumerable和IEnumerator和他们的泛型接口中. IEnumerable:定义了一个可以获取IEnumerator的方法---GetEnumerator(). //IEnumerable的代码实现 public interface IEnumerable { IEnumerator GetEnumerator(); } IEnumerator:则在目标序列上实现循环迭代,直到不再需要数据

  • Python手动或自动协程操作方法解析

    1.手动协程操作: # pip install gevent from greenlet import greenlet def test(): print('He ') gr2.switch() # 切换到test2 print('a ') gr2.switch() def test2(): print('is ') gr1.switch() print('student.') gr1 = greenlet(test) # 创建一个协程 gr2 = greenlet(test2) gr1.sw

  • Python的进程,线程和协程实例详解

    目录 相关介绍 实验环境 进程 多进程 用进程池对多进程进行操作 线程 使用_thread模块实现 使用threading模块实现 协程 使用asyncio模块实现 总结 相关介绍 Python是一种跨平台的计算机程序设计语言.是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的.大型项目的开发. 例如 实验环境 Python 3.x (面向对象的高级语言) Multiprocessin

  • Android中的Coroutine协程原理解析

    前言 协程是一个并发方案.也是一种思想. 传统意义上的协程是单线程的,面对io密集型任务他的内存消耗更少,进而效率高.但是面对计算密集型的任务不如多线程并行运算效率高. 不同的语言对于协程都有不同的实现,甚至同一种语言对于不同平台的操作系统都有对应的实现. 我们kotlin语言的协程是 coroutines for jvm的实现方式.底层原理也是利用java 线程. 基础知识 生态架构 相关依赖库 dependencies { // Kotlin implementation "org.jetb

  • 实例讲解python中的协程

    python协程 线程和进程的操作是由程序触发系统接口,最后的执行者是系统:协程的操作则是程序员. 协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续).协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序. 协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程: event loop是协程执行的控制点, 如果你希望执行协程, 就需要用到它们. event loop提供了如下的特性: 注册.执行.取消延时调用(

  • Unity中协程IEnumerator的使用方法介绍详解

    在Unity中,一般的方法都是顺序执行的,一般的方法也都是在一帧中执行完毕的,当我们所写的方法需要耗费一定时间时,便会出现帧率下降,画面卡顿的现象.当我们调用一个方法想要让一个物体缓慢消失时,除了在Update中执行相关操作外,Unity还提供了更加便利的方法,这便是协程. 在通常情况下,如果我们想要让一个物体逐渐消失,我们希望方法可以一次调用便可在程序后续执行中实现我们想要的效果. 我们希望代码可以写成如下所示: void Fade() { for (float f = 1f; f >= 0;

  • 详解c++20协程如何使用

    什么是协程 新接触的人看了网上很多人的见解都是一头雾水,本人的理解,协程就是可中断的函数,这个函数在执行到某一时刻可以暂停,保存当前的上下文(比如当前作用域的变量,函数参数等等),在后来某一时刻可以手动恢复这个中断的函数,把保存的上下文恢复并从中断的地方继续执行.简而言之,协程就是可中断的函数,协程如何实现:保存上下文和恢复上下文. 你可能会说协程不会这么简单的吧,我这里来举例一下啊,如python的协程 def test(): print('begin') yield print('hello

  • Java协程编程之Loom项目实战记录

    目录 前提 Loom项目简单介绍 Virtual Thread使用 小结 前提 之前很长一段时间关注JDK协程库的开发进度,但是前一段时间比较忙很少去查看OpenJDK官网的内容.Java协程项目Loom(因为项目还在开发阶段,OpenJDK给出的官网https://openjdk.java.net/projects/loom中只有少量Loom项目相关的信息)已经在2018年之前立项,目前已经发布过基于JDK17编译和JDK18编译等早期版本,笔者在下载Loom早期版本的时候只找到JDK18编译

  • Java协程编程之Loom

    目录 Java协程编程Loom 1.Loom项目简单介绍 2.Virtual Thread使用 Java协程编程Loom 前提: OpenJDK给出的官网https://openjdk.java.net/projects/loom有少量Loom项目相关的信息)JDK17编译和JDK18编译等早期版本,Loom早期版本JDK18编译的版本:下载入口在:https://jdk.java.net/loom 由于该JDK版本过高,目前可以使用主流IDE导入Loom-JDK-18+9进行代码高亮和语法提醒

  • python 协程中的迭代器,生成器原理及应用实例详解

    本文实例讲述了python 协程中的迭代器,生成器原理及应用.分享给大家供大家参考,具体如下: 1.迭代器理解 迭代器: 迭代器是访问可迭代对象的工具 迭代器是指用iter(obj)函数返回的对象(实例) 迭代器是指用next(it)函数获取可迭代对象的数据 迭代器函数(iter和next) iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象 next(iterator) 从迭代器iterator中获取下一了记录,如果无法获取下一条记录,则触发

随机推荐