关于C#:yield关键字的确切用法是什么

What is the exact usage of Yield Keyword

本问题已经有最佳答案,请猛点这里访问。

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

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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;
        }
    }
}

输出:

1
2
3
4
5
6
7
8
9
10
------ Using Yield ------
Cow
Goat
Deer
Lion
------ Using List Iteration ------
Cow
Goat
Deer
Lion

直接从msdn

You use a yield return statement to return each element one at a time.When a yield return statement is reached in the iterator method, expression is returned, and the current location in code is retained. Execution is restarted from that location the next time that the iterator function is called.

编辑:要获得详细信息,请参阅本系列文章。


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

yield return可用于将非IEnumerable的内容包装成IEnumerable。

例如:

1
2
3
4
5
6
7
public IEnumerable<string> GetNames()
{
    yield return"Cow";
    yield return"Goat";
    yield return"Lion";
    yield return"Deer";
}

或者一些有实际意义的东西,例如树遍历。


第二个示例中的列表什么也不做-您不返回它,当它在方法末尾超出范围时,它将被垃圾收集。在本例中,yield的惯用用法是:

1
2
3
4
5
6
7
public IEnumerable<string> GetName()
        {
            yield"Cow";
            yield"Goat";
            yield"Deer";
            yield"Lion";
        }

例子:

1
2
3
4
5
6
7
 public IEnumerable<MyClass> GetList()
 {
     foreach (var item in SomeList)
     {
          yield return new MyClass();
     }
 }