C#編程:泛型中接口IEnumerable中GetEnmerator方法的討論

在C#入門經典第六版的第12章裏,有如下代碼:

public class Farm<T> : IEnumerable<T>
      where T : Animal
   {
      private List<T> animals = new List<T>();


      public List<T> Animals
      {
         get
         {
            return animals;
         }
      }

      public IEnumerator<T> GetEnumerator()
      {
         return animals.GetEnumerator();
      }


      IEnumerator IEnumerable.GetEnumerator()
      {
         return animals.GetEnumerator();
      }


      public void MakeNoises()
      {
         foreach (T animal in animals)
         {
            animal.MakeANoise();
         }
      }


      public void FeedTheAnimals()
      {
         foreach (T animal in animals)
         {
            animal.Feed();
         }
      }


      public Farm<Cow> GetCows()
      {
         Farm<Cow> cowFarm = new Farm<Cow>();
         foreach (T animal in animals)
         {
            if (animal is Cow)
            {
               cowFarm.Animals.Add(animal as Cow);
            }
         }
         return cowFarm;
      }
   }


上面的紅色代碼讓我好一陣琢磨。


好好地最究一下,當然要看msdn了,首先聲明一下:下面的討論都是在.Net Framework 4的環境下開展的。

先看看非泛型的:

IEnumerable 接口

.NET Framework 4

公開枚舉器,該枚舉器支持在非泛型集合上進行簡單迭代。

命名空間:  System.Collections
程序集:  mscorlib(在 mscorlib.dll 中)

[ComVisibleAttribute(true)]
[GuidAttribute("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable

IEnumerable 類型公開以下成員。

顯示: 
  名稱 說明
公共方法由 XNA Framework 提供支持h1x9x1b1.PortableClassLibrary(zh-cn,VS.100).gif GetEnumerator 返回一個循環訪問集合的枚舉數。

Enumerator 接口

.NET Framework 4

支持對非泛型集合的簡單迭代。

命名空間:  System.Collections
程序集:  mscorlib(在 mscorlib.dll 中)

[ComVisibleAttribute(true)]
[GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator

IEnumerator 類型公開以下成員。

  名稱 說明
公共屬性由 XNA Framework 提供支持1t2267t6.PortableClassLibrary(zh-cn,VS.100).gif Current 獲取集合中的當前元素。

  名稱 說明
公共方法由 XNA Framework 提供支持1t2267t6.PortableClassLibrary(zh-cn,VS.100).gif MoveNext 將枚舉數推進到集合的下一個元素。
公共方法由 XNA Framework 提供支持1t2267t6.PortableClassLibrary(zh-cn,VS.100).gif Reset 將枚舉數設置爲其初始位置,該位置位於集合中第一個元素之前。

在經典第六版中這樣描述它們的區別:

如果要迭代一個類,可使用方法GetEnumerator(), 其返回類型是IEnumerator.
如果要迭代一個類成員,例如一個方法,則使用IEnumerable.

接下來看看泛型的:

IEnumerable<T> 接口

.NET Framework 4

公開枚舉器,該枚舉器支持在指定類型的集合上進行簡單迭代。

命名空間:  System.Collections.Generic
程序集:  mscorlib(在 mscorlib.dll 中)

public interface IEnumerable<out T> : IEnumerable

類型參數

out T

要枚舉的對象的類型。

該類型參數是協變的。即可以使用指定的類型或派生程度更高的類型。有關協變和逆變的更多信息,請參見泛型中的協變和逆變

IEnumerable<T> 類型公開以下成員。


  名稱 說明
公共方法由 XNA Framework 提供支持9eekhta0.PortableClassLibrary(zh-cn,VS.100).gif GetEnumerator() 返回一個循環訪問集合的枚舉數。(繼承自 IEnumerable。)
公共方法由 XNA Framework 提供支持9eekhta0.PortableClassLibrary(zh-cn,VS.100).gif GetEnumerator() 返回一個循環訪問集合的枚舉數。
答案已經揭曉,示例代碼中出現的個GetEnumerator()就是如上公開的兩個成員方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章