Programmering

Mine to øre på avkastningsnøkkelordet i C #

Avkastningsnøkkelordet, først introdusert i C # 2.0, returnerer T et objekt som implementerer det IE-tallbare grensesnittet. IEnumerable-grensesnittet avslører en IEnumerator som kan brukes til å iterere en ikke-generisk samling ved hjelp av en foreach-løkke i C #. Du kan bruke avkastningsnøkkelordet for å indikere at metoden eller en get accessor der den har blitt brukt, er en iterator.

Det er to måter du kan bruke avkastningsnøkkelordet på: Bruk av "yield return" og "yield break" -uttalelsene. Syntaksen til begge er vist nedenfor.

avkastning avkastning;

avkastningspause;

Hvorfor skal jeg bruke avkastningsordet?

Avkastningsnøkkelordet kan utføre en fullstendig iterasjon uten behov for å lage en midlertidig samling. Med andre ord, når du bruker uttalelsen "yield return" i en iterator, trenger du ikke opprette en midlertidig samling for å lagre data før den returneres. Du kan dra nytte av avkastningsoppgaven for å returnere hvert element i samlingen om gangen, og du kan bruke uttalelsen "avkastningsavkastning" med iteratorer i en metode eller en get accessor.

Vær oppmerksom på at kontrollen returneres til den som ringer hver gang "return return" -utsagnet blir møtt og utført. Viktigst, med hvert slikt anrop bevares informasjonen til callee-tilstanden slik at utførelsen kan fortsette umiddelbart etter avkastningsoppgaven når kontrollen kommer tilbake.

La oss se på et eksempel. Følgende kodebit illustrerer hvordan avkastningsnøkkelordet kan brukes til å returnere et Fibonacci-nummer. Metoden godtar et heltall som argument som representerer antall Fibonacci-tall som skal genereres.

statisk IEnumerable GenerateFibonacciNumbers (int n)

       {

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

          {

avkastning avkastning j;

int temp = j + k;

j = k;

k = temp;

           }

       }

Som vist i kodebiten ovenfor, utsagnet "return return j;" returnerer Fibonacci-tallene en etter en uten å gå ut av "for" -sløyfen. Med andre ord, blir den statlige informasjonen bevart. Slik kan man kalle GenerateFibonacciNumbers-metoden.

foreach (int x i GenerateFibonacciNumbers (10))

   {

Console.WriteLine (x);

   }

Som du kan legge merke til, er det ikke behov for å opprette en mellomliste eller matrise for å holde Fibonacci-tallene som må genereres og returneres til den som ringer.

Legg merke til at under omslaget oppretter avkastningsnøkkelordet en tilstandsmaskin for å opprettholde tilstandsinformasjon. MSDN uttaler: "Når en return return statement oppnås i iterator-metoden, returneres uttrykk, og den gjeldende plasseringen i koden beholdes. Utførelsen startes på nytt fra den plasseringen neste gang iterator-funksjonen blir kalt."

En annen fordel med å bruke avkastningsnøkkelordet er at varene som returneres kun opprettes på forespørsel. Som et eksempel returnerer følgende get accessor partallene mellom 1 og 10.

offentlig statisk IEnumerable EvenNumbers

       {

           {

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

               {

hvis ((i% 2) == 0)

avkastning i;

               }

           }

       }

Du kan få tilgang til den statiske egenskapen EvenNumbers for å vise partallene mellom 1 og 10 i konsollvinduet ved hjelp av kodebiten gitt nedenfor.

foreach (int i EvenNumbers)

     {

Console.WriteLine (i);

     }

Du kan bruke uttalelsen "yield break" i en iterator når det ikke er flere verdier som skal returneres. Uttalelsen om "avkastningsbrudd" brukes til å avslutte opptellingen.

offentlig IEnumerable GetData (IEnumerable items)

{

if (null == varer)

avkastningspause;

foreach (T-element i artikler)

avkastningsavkastningspost;

}

Se kodelisten ovenfor. Legg merke til hvordan det blir gjort en sjekk for å se om parameteren "items" er null. Når du påkaller GetData () -metoden i en iterator og med null som parameter, returnerer kontrollen bare tilbake til den som ringer uten at noen verdi blir returnert.

Poeng å huske

Når du arbeider med avkastningsnøkkelordet, bør du huske på disse punktene:

  • Du kan ikke ha avkastningsoppgaven i en prøvefangst-blokk, men du kan ha den inne i en prøve-endelig-blokk
  • Du kan ikke ha rentebrytelsesoppgaven i en endelig blokk
  • Returtypen til metoden der avkastning er brukt, skal være IEnumerable, IEnumerable, IEnumerator eller IEnumerator
  • Du kan ikke ha en ref eller ut-parameter i metoden din som avkastning har blitt brukt
  • Du kan ikke bruke uttalelsene "yield return" eller "yield break" i anonyme metoder
  • Du kan ikke bruke uttalelsene "yield return" eller "yield break" i "usikre" metoder, dvs. metoder som er merket med "usikkert" nøkkelord for å betegne en usikker kontekst.
$config[zx-auto] not found$config[zx-overlay] not found