Моите два цента за ключовата дума yield в C #

Ключовата дума yield, въведена за първи път в C # 2.0, T връща обект, който реализира интерфейса IEnumerable. Интерфейсът IEnumerable излага IEnumerator, който може да се използва за итерация на негенерична колекция с помощта на foreach цикъл в C #. Можете да използвате ключовата дума yield, за да посочите, че методът или get accessor, в който е бил използван, е итератор.

Има два начина, по които можете да използвате ключовата дума yield: Използване на операторите "yield return" и "yield break". Синтаксисът на двете е показан по-долу.

yield return ;

yield break;

Защо трябва да използвам ключовата дума yield?

Ключовата дума yield може да направи пълна итерация на държавата, без необходимостта от създаване на временна колекция. С други думи, когато използвате израза "yield return" вътре в итератор, не е необходимо да създавате временна колекция за съхраняване на данни, преди да се върне. Можете да се възползвате от оператора yield return, за да връщате всеки елемент в колекцията един по един и можете да използвате израза "yield return" с итератори в метод или get accessor.

Имайте предвид, че контролата се връща на повикващия всеки път, когато се срещне и изпълни операторът "yield return". Най-важното е, че при всяко подобно повикване информацията за състоянието на извикания се запазва, за да може изпълнението да продължи веднага след изявлението за добив, когато контролата се върне.

Нека разгледаме един пример. Следният кодов фрагмент илюстрира как ключовата дума yield може да се използва за връщане на число на Фибоначи. Методът приема цяло число като аргумент, който представлява броя на генерираните числа на Фибоначи.

static IEnumerable GenerateFibonacciNumbers(int n)

       {

           for (int i = 0, j = 0, k = 1; i < n; i++)

          {

               yield return j;

               int temp = j + k;

               j = k;

               k = temp;

           }

       }

Както е показано в кодовия фрагмент по-горе, изявлението „yield return j;“ връща числата на Фибоначи едно по едно, без да излиза от цикъла „for“. С други думи, държавната информация се запазва. Ето как може да се извика методът GenerateFibonacciNumbers.

foreach (int x in GenerateFibonacciNumbers(10))

   {

       Console.WriteLine(x);

   }

Както можете да забележите, не е необходимо да се създава междинен списък или масив, който да съдържа фибоначи номерата, които трябва да бъдат генерирани и върнати на повикващия.

Имайте предвид, че под кориците ключовата дума yield създава автомат за състояние, за да поддържа информация за състоянието. MSDN гласи: "Когато в метода на итератора се достигне изявление за връщане на доходност, изразът се връща и текущото местоположение в кода се запазва. Изпълнението се рестартира от това местоположение при следващото извикване на функцията итератор."

Друго предимство на използването на ключовата дума yield е, че елементите, които се връщат, се създават само при поискване. Като пример, следният get accessor връща четните числа между 1 и 10.

public static IEnumerable EvenNumbers

       {

           вземете

           {

               за (int i = 1; i <= 10; i ++)

               {

                   ако ((i% 2) == 0)

                   възвръщаемост на добива i;

               }

           }

       }

Можете да получите достъп до статичното свойство EvenNumbers, за да покажете четните числа между 1 и 10 в прозореца на конзолата, като използвате кодовия фрагмент, даден по-долу.

foreach (int i in EvenNumbers)

     {

         Console.WriteLine(i);

     }

Можете да използвате израза "yield break" в рамките на итератор, когато няма повече стойности, които да бъдат върнати. Операторът "yield break" се използва за прекратяване на изброяването.

public IEnumerable GetData(IEnumerable items)

{

   if (null == items)

       yield break;

   foreach (T item in items)

       yield return item;

}

Вижте списъка с кодове по-горе. Обърнете внимание как се прави проверка дали параметърът "items" е нулев. Когато извикате метода GetData () в рамките на итератор и с null като параметър, контролата просто се връща обратно към повикващия, без да се връща никаква стойност.

Точки за запомняне

Когато работите с ключовата дума yield, трябва да имате предвид следните точки:

  • Не можете да имате изявлението за връщане на доходност в блок try-catch, въпреки че можете да го имате в блок try-final
  • Не можете да имате изявлението за прекъсване на добива вътре в блок накрая
  • Типът на връщане на метода, при който е използван добив, трябва да бъде IEnumerable, IEnumerable, IEnumerator или IEnumerator
  • Не можете да имате параметър ref или out във вашия метод, в който е използван добив
  • Не можете да използвате изразите "yield return" или "yield break" в анонимни методи
  • Не можете да използвате изразите "yield return" или "yield break" в методите "unsafe", т.е. методи, маркирани с ключовата дума "unsafe", за да обозначат опасен контекст