Programiranje

Moja dva centa za ključno besedo donos v C #

Ključna beseda yield, prvič predstavljena v jeziku C # 2.0, T vrne objekt, ki izvaja vmesnik IEnumerable. Vmesnik IEnumerable izpostavlja IEnumerator, ki se lahko uporablja za ponavljanje ne-generične zbirke z uporabo foreach zanke v C #. Ključno besedo yield lahko uporabite, da označite, da je metoda ali get accessor, v katerem je bila uporabljena, iterator.

Ključno besedo yield lahko uporabite na dva načina: z uporabo stavkov "yield return" in "yield break". Sintaksa obeh je prikazana spodaj.

donosnost donosa;

prekinitev donosa;

Zakaj naj uporabljam ključno besedo yield?

Ključna beseda yield lahko izvede državno polno ponovitev, ne da bi bilo treba ustvariti začasno zbirko. Z drugimi besedami, pri uporabi stavka "yield return" znotraj iteratorja vam ni treba ustvariti začasne zbirke za shranjevanje podatkov, preden se ta vrne. Stavek yield return lahko izkoristite za vrnitev vsakega elementa v zbirki naenkrat, izjavo "yield return" pa lahko uporabite z iteratorji v metodi ali access access.

Upoštevajte, da se kontrolnik vrne klicatelju vsakič, ko naleti in izvrši izjavo "yield return". Najpomembneje je, da se z vsakim takim klicem ohranijo informacije o stanju klicatelja, tako da se lahko izvajanje nadaljuje takoj po izjavi yield, ko se kontrolnik vrne.

Oglejmo si primer. Naslednji delček kode prikazuje, kako lahko ključno besedo yield uporabimo za vrnitev Fibonaccijeve številke. Metoda kot argument sprejme celo število, ki predstavlja število ustvarjenih Fibonaccijevih števil.

static IEnumerable GenerateFibonacciNumbers (int n)

       {

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

          {

donosnost donosa j;

int temp = j + k;

j = k;

k = temp;

           }

       }

Kot je prikazano v zgornjem delčku kode, stavek “yield return j;” vrne Fibonaccijeve številke eno za drugo, ne da bi zapustil zanko "for". Z drugimi besedami, podatki o državi so ohranjeni. Evo, kako lahko pokličete metodo GenerateFibonacciNumbers.

foreach (int x v GenerateFibonacciNumbers (10))

   {

Console.WriteLine (x);

   }

Kot lahko opazite, ni potrebe po ustvarjanju vmesnega seznama ali matrike za zadrževanje številk Fibonacci, ki jih je treba ustvariti in vrniti klicatelju.

Upoštevajte, da pod naslovnicami ključna beseda yield ustvari stanje stroj za vzdrževanje informacij o stanju. MSDN pravi: "Ko je v metodi iteratorja dosežen stavek return return, se vrne izraz in zadrži trenutno mesto v kodi. Izvedba se znova zažene s tega mesta, ko bo naslednjič poklicana funkcija iteratorja."

Druga prednost uporabe ključne besede yield je, da se elementi, ki se vrnejo, ustvarijo samo na zahtevo. Kot primer, naslednji get accessor vrne soda števila med 1 in 10.

javni statični IEnumerable EvenNumbers

       {

dobili

           {

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

               {

če ((i% 2) == 0)

donosnost donosa i;

               }

           }

       }

Do statične lastnosti EvenNumbers lahko dostopate tako, da v oknu konzole prikažejo soda števila med 1 in 10 s pomočjo spodnjega delčka kode.

foreach (int i v EvenNumbers)

     {

Console.WriteLine (i);

     }

Stavek "break break" lahko uporabite v iteratorju, ko ni več vrnjenih vrednosti. Stavek "break break" se uporablja za zaključek naštevanja.

javni IEnumerable GetData (IEnumerable items)

{

če (null == elementov)

prekinitev donosa;

foreach (T element v postavkah)

postavka donosnosti donosa;

}

Glejte zgornji seznam kod. Upoštevajte, kako se opravi preverjanje, ali je parameter "items" ničen. Ko prikličete metodo GetData () znotraj iteratorja in s parametrom null kot parameter, se kontrolnik samo vrne klicatelju, ne da bi bila vrnjena nobena vrednost.

Točke, ki si jih je treba zapomniti

Pri delu s ključno besedo yield upoštevajte te točke:

  • Stavka return return ne morete imeti v bloku try-catch, čeprav ga lahko imate v bloku try-final
  • Izjave o prekinitvi donosa ne morete imeti znotraj bloka final
  • Vrnitev metode, pri kateri je bil uporabljen donos, mora biti IEnumerable, IEnumerable, IEnumerator ali IEnumerator
  • V vaši metodi ne morete imeti parametra ref ali out, pri katerem je bil uporabljen donos
  • V anonimnih metodah ne morete uporabljati stavkov "return return" ali "yield break"
  • Izjav "return return" ali "yield break" znotraj "unsafe" metod ne morete uporabiti, tj. Metod, ki so označene s ključno besedo "unsafe" za označevanje nevarnega konteksta