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

所属分类: 软件编程 / C#教程 阅读数: 68
收藏 0 赞 0 分享

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。

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

更多精彩内容其他人还在看

WPF仿三星手机充电界面实现代码

这篇文章主要为大家详细介绍了WPF仿三星手机充电界面实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

浅谈C#各种数组直接的数据复制/转换

下面小编就为大家带来一篇浅谈C#各种数组直接的数据复制/转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

C#访问SQLServer增删改查代码实例

这篇文章主要为大家详细介绍了C#访问SQLServer增删改查代码实例,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C#根据身份证号码判断出生日期和性别

这篇文章主要为大家详细介绍了C#根据身份证号码判断出生日期和性别的方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C# 向Word中设置/更改文本方向的方法(两种)

在一般情况下word中输入的文字都是横向的,今天小编给大家带来两种方法来设置更改文本方向的方法,非常不错,对c# word 更改文本方向的知识感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

让C# Excel导入导出 支持不同版本Office

让C# Excel导入导出,支持不同版本的Office,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C#设置自定义文件图标实现双击启动(修改注册表)

这篇文章介绍的是利用C#设置自定义文件图标,然后实现双击启动的功能,文章给出了示例代码,介绍的很详细,有需要的可以参考借鉴。
收藏 0 赞 0 分享

C#两个相同属性的类赋值方法

这篇文章主要介绍了C#两个相同属性的类赋值方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

C#中ListView控件实现窗体代码

这篇文章主要介绍了C#中ListView控件实现窗体的核心代码,非常不错,具有参考借鉴价值,对c#listview相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

浅谈C# 序列化与反序列化几种格式的转换

下面小编就为大家带来一篇浅谈C# 序列化与反序列化几种格式的转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多