欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#迭代器及Unity協(xié)程實例解析

 更新時間:2020年05月20日 09:23:22   作者:Fflyqaq  
這篇文章主要介紹了C#迭代器及Unity協(xié)程實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1、C#迭代器

1.1、IEnumerable和IEnumerator

C#中的迭代器封裝在IEnumerable和IEnumerator和他們的泛型接口中。

IEnumerable:定義了一個可以獲取IEnumerator的方法---GetEnumerator()。

  //IEnumerable的代碼實現(xiàn)
  public interface IEnumerable
  {
    IEnumerator GetEnumerator();
  }

IEnumerator:則在目標序列上實現(xiàn)循環(huán)迭代,直到不再需要數(shù)據。常見的foreach循環(huán)就是使用這個接口

  //IEnumerator的代碼實現(xiàn)
  public interface IEnumerator
  {
    /// <summary>
    /// 獲取當前的項(只讀屬性)
    /// </summary>
    object Current { get; }
 
    /// <summary>
    /// 將游標的內部位置向前移動
    /// </summary>
    /// <returns>是否成功</returns>
    bool MoveNext();
 
    /// <summary>
    /// 將游標重置到第一個成員前面
    /// </summary>
    void Reset();
  }

但是為什么會有兩個接口呢?為什么不直接讓IEnumerable實現(xiàn)所有方法呢?

為了不違背單一職責原則。如果有幾個嵌套的foreach循環(huán),那么彼此就可能會收到影響了。

1.2、迭代器使用

C#中的數(shù)組和集合都是繼承了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中的協(xié)程

2.1、進程 線程 協(xié)程介紹

進程:

  • 進程有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統(tǒng)調度。
  • 進程是有獨立功能的程序關于某個數(shù)據集合上的一次運行活動。

線程:

  • 線程有自己獨立的棧和共享的堆,共享堆,不共享棧。線程由操作系統(tǒng)調度。
  • 一個進程可以包含多個線程。
  • 線程異步運行,多處理器中多個線程可同時運行。

協(xié)程:

  • 協(xié)程共享堆,不共享棧,協(xié)程由程序員在協(xié)程的代碼里顯示調度。
  • 協(xié)程執(zhí)行在游戲主線程上,同一時間只能執(zhí)行一個協(xié)程。
  • 線程避免了無意義的調度,提高了性能,但需要程序員自己承擔調度責任。

2.2、協(xié)程使用

Unity的協(xié)程系統(tǒng)是基于C#的一個簡單而強大的接口 ,IEnumerator。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論