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。

以上是 C#迭代器及Unity协程实例解析 的全部内容, 来源链接: utcz.com/z/328023.html

回到顶部