C# - yield return

摘要:C# - yield return

接觸 C# 許久坦白說還真沒使用過 yield return,今天在看 LINQ 的書籍時,看到了其用法。yield return 是在 .Net 2.0 才有的產物,且在方法中傳回實作 IEnumerable 介面的物件集合時, 是使用 yield return 來取代原來的 return 指令。

Code:

using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> docs1 = new List<string>();
            docs1.Add("1");
            docs1.Add("2");
            docs1.Add("3");
            docs1.Add("4");
            docs1.Add("5");

            foreach (var item in Documents1(docs1))
            {
                Console.Write(" {0} ", item);
            }

            Console.Write("\n***********************************\n");

            List<string> docs2 = new List<string>();
            docs2.Add("1");
            docs2.Add("2");
            docs2.Add("3");
            docs2.Add("4");
            docs2.Add("5");

            foreach (var item in Documents2(docs1))
            {
                Console.Write(" {0} ", item);
            }

            Console.ReadKey();
        }

        static IEnumerable Documents1(List<string> docs)
        {
            foreach (var item in docs)
            {
                if (item != "4")
                    yield return item;
            }

            Console.Write(" {0} ", "Holle Danny");
        }

        static IEnumerable Documents2(List<string> docs)
        {
            foreach (var item in docs)
            {
                if (item != "4")
                    yield return item;
                else
                    yield break;
            }

            Console.Write(" {0} ", "Holle Danny");
        }
    }
}

結果:


所以,yield return 跟 return 的區別,return 之後不會再返回到 return 後面的語句繼續執行。

參考:
yield (C# 參考)
使用 yield return 指令傳回匿名型別集合物件
[C# yield return] #2. 另類的應用 - Thread Sync 替代方案
[C#: yield return] #1. How It Work ?