Programmering

Mine to cent på udbytteordet i C #

Udbytte nøgleordet, der først blev introduceret i C # 2.0, returnerer T et objekt, der implementerer den IE-nummerbare grænseflade. IEnumerable-grænsefladen udsætter en IEnumerator, der kan bruges til at gentage en ikke-generisk samling ved hjælp af en foreach-loop i C #. Du kan bruge afkastnøgleordet til at angive, at metoden eller en get accessor, som den er blevet brugt i, er en iterator.

Der er to måder, hvorpå du kan bruge afkastnøgleordet: Brug af "return return" og "yield break" udsagnene. Syntaksen for begge er vist nedenfor.

afkast afkast

udbytte pause

Hvorfor skal jeg bruge udbytteordet?

Udbytte-nøgleordet kan udføre en tilstandsfuld iteration uden behovet for at oprette en midlertidig samling. Med andre ord, når du bruger "return return" -opgørelsen inde i en iterator, behøver du ikke oprette en midlertidig samling for at gemme data, før den returneres. Du kan drage fordel af return return statement til at returnere hvert element i samlingen et ad gangen, og du kan bruge "yield return" -opgørelsen med iteratorer i en metode eller en get accessor.

Bemærk, at kontrollen returneres til den, der ringer op, hver gang "return return" -erklæringen stødes og udføres. Vigtigst er det, at ved hvert sådant opkald bevares callees tilstandsinformation, så udførelsen kan fortsætte straks efter afkastopgørelsen, når kontrollen vender tilbage.

Lad os se på et eksempel. Følgende kodestykke illustrerer, hvordan afkastnøgleordet kan bruges til at returnere et Fibonacci-nummer. Metoden accepterer et heltal som argument, der repræsenterer antallet af Fibonacci-tal, der skal genereres.

statisk IEnumerable GenerateFibonacciNumbers (int n)

       {

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

          {

afkast afkast j;

int temp = j + k;

j = k;

k = temp;

           }

       }

Som vist i kodestykket ovenfor, udsagnet "return return j;" returnerer Fibonacci-numre en efter en uden at afslutte "for" -sløjfen. Med andre ord bevares statsoplysningerne. Sådan kaldes GenerateFibonacciNumbers-metoden.

foreach (int x i GenerateFibonacciNumbers (10))

   {

Console.WriteLine (x);

   }

Som du kan bemærke, er der ikke behov for at oprette en mellemliste eller matrix til at indeholde de Fibonacci-numre, der skal genereres og returneres til den, der ringer op.

Bemærk, at under omslaget opretter udbytte-nøgleordet en tilstandsmaskine til at opretholde tilstandsoplysninger. MSDN siger: "Når en returneringsopgørelse nås i iterator-metoden, returneres udtryk, og den aktuelle placering i koden bevares. Udførelsen genstartes fra den placering, næste gang iterator-funktionen kaldes."

En anden fordel ved at bruge afkastnøgleordet er, at de varer, der returneres, kun oprettes efter behov. Som et eksempel returnerer følgende get accessor lige numre mellem 1 og 10.

offentlig statisk IEnumerable EvenNumbers

       {

           {

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

               {

hvis ((i% 2) == 0)

afkast afkast i;

               }

           }

       }

Du kan få adgang til den statiske egenskab EvenNumbers for at vise lige numre mellem 1 og 10 ved konsolvinduet ved hjælp af nedenstående kodestykke.

foreach (int i EvenNumbers)

     {

Console.WriteLine (i);

     }

Du kan bruge "yield break" -erklæringen i en iterator, når der ikke er flere værdier, der skal returneres. "Renteafbrydelsen" anvendes til at afslutte optællingen.

offentlige IEnumerable GetData (IEnumerable items)

{

hvis (null == varer)

udbytte pause

foreach (T-vare i varer)

afkast returpost;

}

Se kodelisten ovenfor. Bemærk, hvordan en kontrol foretages for at se, om parameteren "items" er nul. Når du påberåber sig GetData () -metoden i en iterator og med null som parameter, vender kontrollen bare tilbage til den, der ringer op, uden at nogen værdi returneres.

Punkter at huske

Når du arbejder med afkastnøgleordet, skal du huske disse punkter:

  • Du kan ikke have afkastafkastopgørelsen i en prøvefangst-blok, selvom du kan have den inde i en prøve-endelig blok
  • Du kan ikke have rentebrydningsopgørelsen inde i en endelig blok
  • Returtypen for metoden, hvor udbytte er brugt, skal være IEnumerable, IEnumerable, IEnumerator eller IEnumerator
  • Du kan ikke have en ref eller ud-parameter i din metode, hvor udbyttet er blevet brugt
  • Du kan ikke bruge "yield return" eller "yield break" udsagnene inden for anonyme metoder
  • Du kan ikke bruge udsagnene "return return" eller "yield break" inden for "usikre" metoder, dvs. metoder, der er markeret med "usikre" nøgleord for at betegne en usikker kontekst.