zoukankan      html  css  js  c++  java
  • 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、进程 线程 协程介绍

    进程:

    1. 进程有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
    2. 进程是有独立功能的程序关于某个数据集合上的一次运行活动。

    线程:

    1. 线程有自己独立的栈和共享的堆,共享堆,不共享栈。线程由操作系统调度。
    2. 一个进程可以包含多个线程。
    3. 线程异步运行,多处理器中多个线程可同时运行。

    协程:

    1. 协程共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
    2. 协程执行在游戏主线程上,同一时间只能执行一个协程。
    3. 线程避免了无意义的调度,提高了性能,但需要程序员自己承担调度责任。

    2.2、协程使用

    Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator。

    详细请看大佬:
    https://blog.csdn.net/huang9012/article/details/38492937

  • 相关阅读:
    Python 之解析配置文件模块ConfigParser
    SonarQube代码质量管理平台
    SVN代码统计工具StatSVN
    python 3接口测试
    python+selenium使用chrome时,报错ignore certificate errors
    python3发送邮件(有附件)
    日记
    杂记 包含 serialize().ajaxStart() .ajaxStop()以及其他
    还是要说一下XML。全当日记
    桑心!XML
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/12909866.html
Copyright © 2011-2022 走看看