Ohjelmointi

Kaksi senttiäni tuoton avainsanalla C #

Tuottoavainsana, joka esiteltiin ensimmäisen kerran C # 2.0: ssa, T palauttaa objektin, joka toteuttaa IEnumerable-käyttöliittymän. IEnumerable-käyttöliittymä paljastaa IEnumeratorin, jota voidaan käyttää toistamaan ei-yleinen kokoelma käyttämällä foreach-silmukkaa C #: ssä. Voit käyttää tuotto-avainsanaa osoittamaan, että menetelmä tai get accessor, jossa sitä on käytetty, on iteraattori.

Tuottoavainsanaa voidaan käyttää kahdella tavalla: "Tuotto-tuotto" - ja "Tuotto-ero" -lausekkeiden käyttäminen. Molempien syntaksit on esitetty alla.

tuoton tuotto;

tuotto tauko;

Miksi minun pitäisi käyttää tuotto-avainsanaa?

Tuotto-avainsana voi tehdä koko tilan iteroinnin ilman tarvetta luoda väliaikainen kokoelma. Toisin sanoen, kun käytät "return return" -käskyä iteraattorin sisällä, sinun ei tarvitse luoda väliaikaista kokoelmaa tietojen tallentamiseksi ennen kuin ne palautetaan. Voit hyödyntää tuottopalautuslauseketta palauttaaksesi kukin kokoelman elementti yksi kerrallaan, ja voit käyttää "tuotto-paluu" -lauseketta iteraattorien kanssa menetelmässä tai get accessor -ohjelmassa.

Huomaa, että ohjaus palautetaan soittajalle joka kerta, kun "tuotto-paluu" -lause havaitaan ja suoritetaan. Tärkeintä on, että jokaisen tällaisen puhelun yhteydessä Calleen tilatiedot säilytetään, jotta toteutus voi jatkua heti tuottolausunnon jälkeen, kun ohjaus palaa.

Katsotaanpa esimerkkiä. Seuraava koodinpätkä kuvaa, kuinka tuottoavainsanaa voidaan käyttää Fibonacci-numeron palauttamiseen. Menetelmä hyväksyy kokonaisluvun argumenttina, joka edustaa luotavien Fibonacci-lukujen määrää.

staattinen IEnumerable GenerateFibonacciNumbers (int n)

       {

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

          {

tuoton tuotto j;

int lämpötila = j + k;

j = k;

k = lämpötila;

           }

       }

Kuten yllä olevasta koodikatkelmasta käy ilmi, lauseke ”return return j;” palauttaa Fibonacci-numerot yksitellen poistumatta “for” -silmukasta. Toisin sanoen valtion tiedot säilyvät. Näin GenerateFibonacciNumbers-menetelmää voidaan kutsua.

foreach (int x GenerateFibonacciNumbersissa (10))

   {

Console.WriteLine (x);

   }

Kuten huomaat, ei tarvitse luoda väliluetteloa tai taulukkoa fibonacci-numeroiden säilyttämiseksi, jotka on luotava ja palautettava soittajalle.

Huomaa, että kannen alla tuottoavainsana luo tilakoneen ylläpitämään tilatietoja. MSDN toteaa: "Kun tuoton palautuslauseke saavutetaan iteraattorimenetelmällä, lauseke palautetaan ja nykyinen sijainti koodissa säilytetään. Suoritus aloitetaan uudelleen kyseisestä sijainnista seuraavan kerran, kun iteraattoritoiminto kutsutaan."

Toinen tuotto-avainsanan käytön etu on, että palautettavat tuotteet luodaan vain pyynnöstä. Esimerkiksi seuraava get accessor palauttaa parilliset luvut 1-10.

julkinen staattinen IEnumerable EvenNumbers

       {

saada

           {

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

               {

jos ((i% 2) == 0)

tuoton tuotto i;

               }

           }

       }

Voit käyttää staattista EvenNumbers-ominaisuutta näyttämään parilliset numerot välillä 1–10 konsoli-ikkunassa alla olevan koodinpätkän avulla.

foreach (int i parillisissa numeroissa)

     {

Console.WriteLine (i);

     }

Voit käyttää "tuottoero" -lausetta iteraattorissa, kun palautettavia arvoja ei ole enää. Laskennan lopettamiseksi käytetään "tuottoeron" lausetta.

public IEnumerable GetData (IEnumerable items)

{

jos (null == kohdetta)

tuotto tauko;

foreach (T kohde tuotteissa)

tuotto palautuserä;

}

Katso yllä oleva koodiluettelo. Huomaa, miten tarkistetaan, onko "items" -parametri nolla. Kun vedot GetData () -menetelmää iteraattorissa ja parametrilla nolla, ohjaus palaa takaisin takaisin soittajalle ilman mitään arvoa.

Muistettavaa

Kun työskentelet tuotto-avainsanan kanssa, sinun on pidettävä mielessä nämä seikat:

  • Tuotto palautuslauseketta ei voi olla try-catch-lohkossa, vaikka se voi olla try-last-lohkon sisällä
  • Tuottoerotuslauseketta ei voi olla viimeisen lohkon sisällä
  • Menetelmän palautustyypin, jossa tuottoa on käytetty, tulisi olla IEnumerable, IEnumerable, IEnumerator tai IEnumerator
  • Menetelmässäsi ei voi olla ref- tai out-parametria, jossa tuottoa on käytetty
  • Et voi käyttää "tuotto-paluu" - tai "tuotto-rikkomus" -lausekkeita nimettömissä menetelmissä
  • Et voi käyttää "tuotto-paluu" - tai "tuotto-rikkomus" -lausekkeita "vaarallisten" menetelmien sisällä, ts. Menetelmiä, jotka on merkitty avainsanalla "vaarallinen" merkitsemään vaarallista kontekstia.
$config[zx-auto] not found$config[zx-overlay] not found