Programovanie

Moje dva centy za kľúčové slovo výnos v C #

Kľúčové slovo výnos, ktoré bolo prvýkrát predstavené v C # 2.0, vráti objekt, ktorý implementuje rozhranie IEnumerable. Rozhranie IEnumerable vystavuje IEnumerator, ktorý sa dá použiť na iteráciu negenerickej kolekcie pomocou slučky foreach v C #. Môžete použiť kľúčové slovo výnos na označenie, že metóda alebo prístupový objekt get, v ktorom sa použila, je iterátor.

Existujú dva spôsoby, ako môžete použiť kľúčové slovo výnosu: Použitie príkazov „výnosový výnos“ a „výnosový zlom“. Syntax oboch je uvedená nižšie.

výnosová návratnosť;

výnosový zlom;

Prečo by som mal používať kľúčové slovo výnos?

Kľúčové slovo výnos môže urobiť úplnú iteráciu bez potreby vytvorenia dočasnej zbierky. Inými slovami, pri použití príkazu „výnos výnosu“ vo vnútri iterátora nemusíte vytvárať dočasnú kolekciu na ukladanie údajov skôr, ako sa vráti. Môžete využiť výhodu príkazu výnosov na vrátenie každého prvku v kolekcii po jednom a príkaz „výnos výnosov“ môžete použiť s iterátormi v metóde alebo prístupovým objektom get.

Upozorňujeme, že kontrola sa vracia volajúcemu zakaždým, keď sa vyskytne a vykoná príkaz „výnos výnosu“. Najdôležitejšie je, že pri každom takomto volaní sa zachovajú volané informácie o stave, aby vykonávanie mohlo pokračovať okamžite po príkaze výnosu, keď sa ovládací prvok vráti.

Pozrime sa na príklad. Nasledujúci úryvok kódu ilustruje, ako je možné použiť kľúčové slovo výťažku na vrátenie Fibonacciho čísla. Metóda prijíma celé číslo ako argument, ktorý predstavuje počet generovaných čísel Fibonacci.

statický IEnumerable GenerateFibonacciNumbers (int n)

       {

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

          {

výnos výnos j;

int temp = j + k;

j = k;

k = teplota;

           }

       }

Ako je uvedené v útržku kódu vyššie, vyhlásenie „výnos vráti j;“ vráti čísla Fibonacciho jedno po druhom bez opustenia slučky „pre“. Inými slovami, informácie o stave sa zachovajú. Takto možno nazvať metódu GenerateFibonacciNumbers.

foreach (int x v GenerateFibonacciNumbers (10))

   {

Console.WriteLine (x);

   }

Ako si môžete všimnúť, nie je potrebné vytvárať prechodný zoznam alebo pole na uchovanie fibonacciho čísel, ktoré je potrebné vygenerovať a vrátiť volajúcemu.

Všimnite si, že pod obálkami kľúčové slovo výťažok vytvorí stavový stroj na udržiavanie informácií o stave. MSDN uvádza: "Keď sa v metóde iterátora dosiahne výnosový výnos, vráti sa výraz a zachová sa súčasné umiestnenie v kóde. Spustenie sa z tohto umiestnenia reštartuje pri nasledujúcom volaní funkcie iterátora."

Ďalšou výhodou použitia kľúčového slova výnos je, že vrátené položky sa vytvárajú iba na požiadanie. Napríklad nasledujúci get accessor vráti párne čísla medzi 1 a 10.

verejné statické IEnumerable EvenNumbers

       {

dostať

           {

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

               {

if ((i% 2) == 0)

výnosová návratnosť i;

               }

           }

       }

K statickej vlastnosti EvenNumbers môžete pristupovať a pomocou párového kódu uvedeného nižšie zobraziť párne čísla medzi 1 a 10 v okne konzoly.

foreach (int i v EvenNumbers)

     {

Console.WriteLine (i);

     }

Ak v iterátore už nie sú k dispozícii žiadne ďalšie hodnoty, môžete použiť príkaz „yield break“. Príkaz "výnosový zlom" sa používa na ukončenie výpočtu.

verejné IEnumerable GetData (IEnumerable items)

{

if (null == položky)

výnosový zlom;

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

výnosová položka;

}

Prečítajte si zoznam kódov vyššie. Všimnite si, ako sa kontroluje, či je parameter „items“ null. Keď vyvoláte metódu GetData () v rámci iterátora a s parametrom null ako parametrom, ovládací prvok sa vráti späť k volajúcemu bez vrátenia akejkoľvek hodnoty.

Body, ktoré treba pamätať

Pri práci s kľúčovým slovom výnos by ste mali mať na pamäti tieto body:

  • V bloku try-catch nemôžete mať vyhlásenie o výnose, aj keď ho môžete mať v bloku try-konečne
  • Vo vnútri bloku konečne nemôžete mať vyhlásenie o rozdelení výnosov
  • Návratový typ metódy, pri ktorej sa použil výnos, by mal byť IEnumerable, IEnumerable, IEnumerator alebo IEnumerator
  • Vo svojej metóde, v ktorej sa použil výnos, nemôžete mať parameter ref alebo out
  • V anonymných metódach nemôžete použiť vyhlásenia „výnosový výnos“ alebo „výnosový zlom“
  • Výroky „výnos výnosu“ alebo „výnos výťažok“ nemôžete použiť vo vnútri „nebezpečných“ metód, t. J. Metód, ktoré sú označené kľúčovým slovom „nebezpečný“ na označenie nebezpečného kontextu.
$config[zx-auto] not found$config[zx-overlay] not found