C#中yield return 语法糖

可以再开始这篇文章之前看看以前记录的/csharp

可以看到上文中使用了这样的语法

public IEnumerator GetEnumerator()
   {
       for (int index = this.TargetStr.Length; index > 0;index-- )
       {
           yield return this.TargetStr[index - 1];
       }

   }  

迭代器yield return的语法就是告诉编译器.这个方法不是一个简单的方法.而是实现了一个迭代器块的方法.这个方法被声明为返回IEnumerator的一个接口.所以就只能使用迭代器来实现返回类型为IEnumerable,IEnumerator或泛型等价物的方法.如果方法声明的返回类型是非泛型接口,那么迭代器的生成类型是object,否则就是泛型接口的参数类型.例如,如果方法声明为返回值为IEnumerator,那么就会得到string类型的生成类型. 结合上一篇文章.2 来看看下面的这段代码

public static IEnumerable<string> ReadLines(string filename)
    {
        using (TextReader reader = File.OpenText(filename))
        {
            string line;
            while ((line=reader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }  

可以看到,上面这段代码实现了对于一个文件的遍历读取每一行. 在foreach中释放迭代器非常重要.它可以确保阅读器被清理干净.迭代器方法中的using语句扮演了try/finally块.在达到文件末尾或者中途调用IEnumerableDispose方法,将进入finally块来释放迭代器.

发表评论

电子邮件地址不会被公开。 必填项已用*标注