Inside.Net

自由与繁荣的国度

博客园 首页 新随笔 联系 订阅 管理

C#2.0 迭代器

关键字 yield return

C#2.0通过强大的yield return关键字无缝实现了迭代器模式。特别是减轻了开发者实现一个枚举器和可枚举类的负担。这里我重写了一个前面的例子:

using System;
using System.Collections;
public class Persons : IEnumerable
{
    
string[] m_Names;
    
public Persons(params string[] Names)
    
{
        m_Names 
= new string[Names.Length];
        Names.CopyTo(m_Names,
0);
    }

    
public IEnumerator GetEnumerator()
    
{
        
foreach (string s in m_Names)
        
{
            yield 
return s;
        }

    }

}

class Program
{
    
static void Main(string[] args)
    
{
        Persons arrPersons 
= new Persons(“Michel”,”Christine”,”Mathieu”,”Julien”);
        
foreach (string s in arrPersons)
        
{
            Console.WriteLine(s);
            Console.ReadLine();
        }

    }

}


别被yield return关键字的行为所困扰。Yield return关键字看起来像是返回了一个字符串但是实际上是通过调用GetEnumerator()方法返回了Ienumerable这个对象。既然我们不能明确的提供这样的实现,那么该由那个类实现IEnumerator的返回呢。本文将对此展开讨论并深入到Csharp2.0迭代器基本原理揭示这些神秘的东西。

注意:方法能对yield return关键字多次调用.实例如下:

using System; 
using System.Collections; 
public class Persons : IEnumerable 

    
string[] m_Names; 
    
public Persons(params string[] Names) 
    

        m_Names 
= new string[Names.Length]; 
        Names.CopyTo(m_Names,
0); 
    }
 

    
public IEnumerator GetEnumerator() 
    

        yield 
return "Michel"
        yield 
return "Chirstine"
        yield 
return "Mathieu"
        yield 
return "Julien"
    }
 
}
 
class Program 

    
static void Main(string[] args) 
    

        Persons arrPersons 
= new Persons("Michel","Christine","Mathieu","Julien"); 
        
foreach (string s in arrPersons) 
        

            Console.WriteLine(s); 
            Console.ReadLine(); 
        }
 
    }
 
}
 


这段程序将同样产生以下输出

       Michel
       Christine
       Mathieu 
      Julien

未完待续。。。。。
posted on 2005-03-29 22:29  Bluefee.Net  阅读(897)  评论(1编辑  收藏  举报