Yield Keyword的确切用法是什么?

时间:2014-02-20 12:05:07

标签: c# asp.net .net yield-return

在下面的代码中,我创建了一个使用Yield打印值的方法,另一个只是一个简单的列表迭代。所以这里我的问题是从这两种方法获得的输出是相同的,那么为什么我们选择Yield关键字呢?还请告诉我应用程序中Yield关键字的确切用法。

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace YieldKeyWordEg
{
    class Program
    {
        static void Main(string[] args)
        {
            Animals obj = new Animals();
            Console.WriteLine("------ Using Yield ------");
            foreach (var item in obj.GetName())
            {
                Console.WriteLine(item);
            }

            Console.WriteLine("------ Using List Iteration ------");
            foreach (var items in obj.GetNameinList())
            {
                Console.WriteLine(items);
            }
            Console.ReadLine();
        }
    }
    class Animals
    {
        public IEnumerable<string> GetName()
        {
            List<string> objList = new List<string>();
            objList.Add("Cow");
            objList.Add("Goat");
            objList.Add("Deer");
            objList.Add("Lion");
            foreach (var item in objList)
            {
                yield return item;
            }
        }
        public List<string> GetNameinList()
        {
            List<string> objList = new List<string>();
            objList.Add("Cow");
            objList.Add("Goat");
            objList.Add("Deer");
            objList.Add("Lion");
            return objList;
        }
    }
}

输出:

------ Using Yield ------
Cow
Goat
Deer
Lion
------ Using List Iteration ------
Cow
Goat
Deer
Lion

4 个答案:

答案 0 :(得分:4)

直接来自MSDN

  

使用yield return语句一次返回一个元素。当在迭代器方法中达到yield return语句时,将返回表达式,并保留代码中的当前位置。下次调用迭代器函数时,将从该位置重新开始执行。

修改 要获取详细信息,请参阅this系列文章。

答案 1 :(得分:2)

使用yield return来包装已经是IEnumerable的东西是浪费。

yield return可用于将 IEnumerable包装成IEnumerable。

如:

public IEnumerable<string> GetNames()
{
    yield return "Cow";
    yield return "Goat";
    yield return "Lion";
    yield return "Deer";
}

或者实际上有意义的事情,例如a tree traversal

答案 2 :(得分:0)

示例:

 public IEnumerable<MyClass> GetList()
 {
     foreach (var item in SomeList)
     {
          yield return new MyClass();
     }
 }

答案 3 :(得分:0)

第二个示例中的列表不执行任何操作 - 您不会返回它,并且当它在方法结束时超出范围时将被垃圾收集。在此示例中yield的惯用法是:

public IEnumerable<string> GetName()
        {
            yield "Cow";
            yield "Goat";
            yield "Deer";
            yield "Lion";
        }