Programování

Moje dva centy na klíčové slovo výnos v C #

Klíčové slovo yield, poprvé představené v C # 2.0, T vrací objekt, který implementuje IEnumerable rozhraní. Rozhraní IEnumerable zpřístupňuje IEnumerator, který lze použít k iteraci negenerické kolekce pomocí smyčky foreach v C #. Klíčové slovo yield můžete použít k označení, že metoda nebo přístupový objekt get, ve kterém byla použita, je iterátor.

Existují dva způsoby, jak můžete použít klíčové slovo výnos: Použití příkazů „výnos vrátit“ a „výnos přerušit“. Syntaxe obou je uvedena níže.

výnos výnos;

zlomek výnosu;

Proč bych měl používat klíčové slovo výnos?

Klíčové slovo výnos může provést úplnou iteraci stavu bez nutnosti vytvoření dočasné kolekce. Jinými slovy, při použití příkazu „yield return“ uvnitř iterátoru nemusíte vytvářet dočasnou kolekci pro ukládání dat, než se vrátí. Můžete využít výhod příkazu return return k vrácení každého prvku v kolekci po jednom a můžete použít příkaz "yield return" s iterátory v metodě nebo get accessoru.

Všimněte si, že ovládací prvek je vrácen volajícímu pokaždé, když je zjištěn a spuštěn příkaz „výnos návratu“. Nejdůležitější je, že s každým takovým voláním jsou zachovány informace o stavu volaného, ​​takže provádění může pokračovat okamžitě po prohlášení o výnosu, když se ovládací prvek vrátí.

Podívejme se na příklad. Následující fragment kódu ukazuje, jak lze klíčové slovo yield použít k vrácení čísla Fibonacci. Metoda přijímá celé číslo jako argument, který představuje počet Fibonacciho čísel, která se mají vygenerovat.

statický IEnumerable GenerateFibonacciNumbers (int n)

       {

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

          {

výnos výnos j;

int temp = j + k;

j = k;

k = teplota;

           }

       }

Jak je ukázáno ve fragmentu kódu výše, výraz „výnos vrátí j;“ vrací Fibonacciho čísla po jednom, aniž by opustil smyčku „pro“. Jinými slovy, informace o stavu jsou zachovány. Zde je možné volat metodu GenerateFibonacciNumbers.

foreach (int x v GenerateFibonacciNumbers (10))

   {

Console.WriteLine (x);

   }

Jak si můžete všimnout, není třeba vytvářet mezilehlý seznam nebo pole, které by uchovávalo čísla fibonacci, která je třeba generovat a vrátit volajícímu.

Všimněte si, že pod kryty klíčové slovo yield vytvoří stavový stroj pro udržování informací o stavu. MSDN uvádí: "Když je v metodě iterátoru dosaženo výnosu s návratem výtěžku, je vrácen výraz a aktuální umístění v kódu je zachováno. Spuštění je z tohoto umístění restartováno při příštím volání funkce iterátoru."

Další výhodou použití klíčového slova výnos je, že vrácené položky jsou vytvářeny pouze na vyžádání. Následující příklad get accessor vrací sudá čísla mezi 1 a 10.

veřejné statické IEnumerable EvenNumbers

       {

dostat

           {

pro (int i = 1; i <= 10; i ++)

               {

if ((i% 2) == 0)

výnos výnosu i;

               }

           }

       }

Ke statické vlastnosti EvenNumbers můžete přistupovat k zobrazení sudých čísel mezi 1 a 10 v okně konzoly pomocí níže uvedeného fragmentu kódu.

foreach (int i v EvenNumbers)

     {

Console.WriteLine (i);

     }

Pokud v iterátoru není možné vrátit žádné další hodnoty, můžete použít příkaz „yield break“. Příkaz "yield break" se používá k ukončení výčtu.

veřejná IEnumerable GetData (IEnumerable položky)

{

if (null == položky)

zlomek výnosu;

foreach (T položka v položkách)

výnos výnos položky;

}

Viz výše uvedený seznam kódů. Všimněte si, jak se kontroluje, zda je parametr „items“ null. Když vyvoláte metodu GetData () v rámci iterátoru a jako parametr null jako, vrátí se ovládací prvek zpět zpět volajícímu bez vrácení jakékoli hodnoty.

Body k zapamatování

Při práci s klíčovým slovem výnos byste měli pamatovat na tyto body:

  • V bloku try-catch nemůžete mít výnosový výnos, i když ho můžete mít uvnitř bloku try-finally
  • V konečně bloku nemůžete mít prohlášení o výnosu
  • Návratový typ metody, kde byl použit výnos, by měl být IEnumerable, IEnumerable, IEnumerator nebo IEnumerator
  • Ve vaší metodě, ve které byl použit výtěžek, nemůžete mít parametr ref or out
  • Uvnitř anonymních metod nemůžete použít příkazy „yield return“ nebo „yield break“
  • V rámci „nebezpečných“ metod nemůžete použít příkazy „výnosový výnos“ nebo „výnosový výnos“, tj. Metody, které jsou označeny klíčovým slovem „nebezpečný“ k označení nebezpečného kontextu
$config[zx-auto] not found$config[zx-overlay] not found