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()就是如上公开的两个成员方法

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