Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 26370|Svare: 0

[Kilde] C# Bruk av yield-nøkkelord

[Kopier lenke]
Publisert på 29.05.2019 09:55:11 | | | |
1. Funksjoner implementert ved yield

Avkastning:

La oss se på følgende kode, som implementerer en funksjon som ligner på å traversere et array med foreach gjennom yield return, og indikerer at yield return også brukes til å implementere iteratorens funksjon.

Yield break:

Ser man på koden nedenfor, er det kun 1 og 2 som er utdata, men ikke 3, noe som indikerer at iteratoren ble stoppet av yield break, så yield break brukes til å avslutte iterasjonen.

2. Den kan kun brukes i <T><T>metoder, operatorer, hent-accessorer som må returnere en IEnumerable, IEnumerable, IEnumerator eller IEnumerator.

3. Implementeringsprinsippet for yield keyword

Vi erstattet foreach-løkken med en while-løkke og fant ut at selv om vi ikke implementerte GetEnumerator(), og heller ikke implementerte tilsvarende IEnumerators MoveNext() og Current-egenskaper, jobbet vi fortsatt med disse funksjonene.

Når det gjelder hvorfor dette er tilfelle, kan vi bruke ILSpy til å dekompilere den genererte exe-filen for å finne årsaken.

Siden direkte dekompilering til C# vil bli som det er



Derfor valgte vi å dekompilere det til IL-kode med C#-annotasjoner, selv om lesbarheten er dårlig, men vi kan forstå prinsippene i detalj.
La oss først se på oversettelsen av programmet, en ny klasse genereres automatisk under kompileringen.



La oss se nærmere på koden, og EnumerableFuc() returnerer denne nye klassen.



Når vi ser på implementeringen av klassen som denne koden genererer automatisk, kan vi se at den arver IEnumerable<T>, IEnumerable, IEnumerator eller IEnumerator, og vi <T>bør kunne gjette at denne nye klassen er grunnen til at vi ikke implementerer de tilsvarende IEnumerator-egenskapene MoveNext() og Current, men vi kan fortsatt bruke disse funksjonene normalt.



La oss se på hvordan denne klassen iterererer, la oss hovedsakelig se på MoveNext()-funksjonen





Hvert kall til MoveNext()-funksjonen legger til 1 til tilstanden, og totalt 4 iterasjoner gjøres, hvor de tre første returnerer sann og den siste returnerer falsk, noe som betyr slutten på iterasjonen. Disse fire iterasjonene tilsvarer utsagnene i enumberableFuc() som er delt inn i 4 deler med 3 yield return-setninger.

Den reelle prosessen med å iterere med enumberableFuc() er:

1. Kjør funksjonen enumberableFuc() for å hente en instans av klassen som automatisk genereres av koden.
2. Kall deretter GetEnumberator()-funksjonen for å begynne å iterere på den ervervede klassen som en iterator.
3. Hver gang du kjører MoveNext(), øker tilstanden med 1, og switch-setningen lar deg kjøre ulike deler av koden hver gang du kaller MoveNext().
4。 MoveNext() returnerer false, avsluttende.
Dette viser også at yield-nøkkelordet faktisk er et syntaktisk sukker, og det er til syvende og sist en iterativ funksjon implementert ved å implementere grensesnittene IEnumberable<T>, IEnumberable, <T>IEnumberator og IEnumberator.





Foregående:. .NET-motstandsdyktighet og håndtering av midlertidig feil Polly-retry-strategi
Neste:HttpResult får en set-cookie i stedet for en cookie
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com