expresii Lambda (Ghid de programare C #), documente Microsoft

În acest articol,

Expresia lambda - este o funcție anonimă. cu care puteți crea tipuri delegatului și arbori de expresie. Utilizarea expresii lambda pot fi scrise funcții locale care pot fi folosite ca argumente sau returnează ca valori ale apelurilor de funcții. expresii Lambda sunt utile mai ales atunci când scrieți expresii de interogare LINQ.

Pentru a crea o expresie lambda, trebuie să specificați parametrii de intrare (dacă există) de pe partea stângă a operatorului lambda =>. și puneți un bloc de expresii sau operatori pe de altă parte. De exemplu, o expresie lambda x => x * x setează parametrul numit x și returnează valoarea lui x. Puteți atribui o expresie a unui tip delegat, așa cum se arată în exemplul următor:

Creați o expresie de tip arbore:

=> Operatorul are aceeași prioritate ca operatorul de atribuire (=), și asociații la dreapta (a se vedea. Secțiunea „asociativitate“ operatorilor din articol).

Operatorii Lambda utilizate în LINQ cererile întemeiate pe metodele folosite ca argumente ale metodelor standard ale operatorilor de interogare cum ar fi cazul.

Când utilizați sintaxa bazată pe metode pentru a apela În cazul în care metoda din clasa enumerable (așa cum se face în LINQ Obiecte și LINQ XML) parametru este tipul de delegat System.Func. Expresia Lambda - acesta este cel mai convenabil mod de a crea un delegat. Când apelați aceeași metodă, de exemplu, în System.Linq.Queryable clasă (așa cum se face în LINQ SQL) de tip parametru va System.Linq.Expressions.Expression. în cazul în care func - este orice delegati cu un număr de func ții de parametri de intrare nu este mai mare de șaisprezece ani. Din nou, expresiile lambda sunt cel mai rapid mod de a construi un arbore de expresie. expresii Lambda permit efectuarea de apeluri În cazul în care să arate la fel, dar, de fapt, un obiect creat de expresia lambda are un tip diferit.

Rețineți că, în delegatul exemplul de mai sus semnătura are un parametru de intrare implicită de tip int și returnează o valoare de tip int. Expresia lambda poate fi transformată în tipul corespunzător delegat, deoarece acesta are, de asemenea, un parametru de intrare (x) și returnează valoarea pe care compilatorul poate convertite implicit la tipul int. (Tipurile Concluzie discutate mai detaliat în următoarele secțiuni.) Delegatul cauzată de un parametru de intrare, 5, 25 returnează rezultatul.

expresii Lambda nu poate fi folosit pe partea stângă este sau ca operator.

Toate restricțiile care se aplică metode anonime se aplică și expresii lambda. Pentru mai multe informații, consultați. Anonymous secțiunea metode.

expresii Lambda,

expresie lambda cu o expresie pe partea dreaptă a operatorului => se numește lambda expresie. Lambda-expresie frecvent utilizate în construcția de arbori de expresie. Expresii expresii lambda și returnează rezultatul următoarea formă de bază.

În cazul în care expresia lambda are un singur parametru de intrare, nu puteți pune între paranteze; în toate celelalte cazuri, acestea sunt necesare. Doi sau mai mulți parametri de intrare sunt separate prin virgulă și între paranteze:

Uneori, compilatorul poate fi dificil sau chiar imposibil de a determina tipurile de intrare. În acest caz, tipurile pot fi specificate în mod explicit, așa cum se arată în exemplul următor.

Zero număr de parametri de intrare pentru a specifica un gol paranteze:

Rețineți că corpul lambda expresie poate consta dintr-un apel de metodă, așa cum se arată în exemplul anterior. Cu toate acestea, atunci când creați un arbore de expresie care se calculează NET Framework, cum ar fi SQL Server, nu utilizează apeluri de metode în expresii lambda. Aceste metode nu au nici un sens în afara contextului mediului CLR .NET.

operatorul lambda

Operatorul Lambda seamănă cu lambda expresie cu excepția faptului că operatorul (sau operatori) este cuprins intre paranteze:

corpul operatorului lambda poate consta din orice număr de operatori; dar, în practică, nu este de obicei folosit pentru mai mult de două sau trei.

Operatorii Lambda ca metode anonime nu pot fi folosite pentru a crea copaci de expresie.

Asynchronous Lambda

Utilizați async cuvinte cheie și așteaptă puteți crea cu ușurință expresii și operatori lambda, inclusiv prelucrarea asincronă. De exemplu, în următorul Windows Forms exemplu conține un handler eveniment care solicită o metodă asincron ExampleMethodAsync și așteaptă pentru el.

Același eveniment poate fi handler adăugate folosind expresii lambda asincrone. Pentru a adăuga acest handler, setați modificatorul async înaintea listei de expresie parametrilor lambda, așa cum se arată în exemplul următor.

Operatorii de interogare standard, Lambda

Mulți operatori de interogare standard au un parametru de intrare al cărui tip aparține familiei de func delegati universale. Acești delegați de tip parametri utilizați pentru a determina numărul și tipurile de parametri de intrare precum și tipul de întoarcere a valorii delegat. delegati plinit sunt foarte utile pentru a îngloba expresii personalizate, care sunt aplicate fiecărui element din setul de date de intrare. Ca un exemplu, luați în considerare următorul tip de delegat.

O instanță a unui delegat poate fi creat de func myFunc. în cazul în care int - parametru de intrare si bool - valoarea de retur. Valoarea returnată este întotdeauna specificat în ultimul tip de parametru. FUNC Acesta definește un delegat cu doi parametri de intrare, int și șir. și tipul de retur bool. Pe lângă apelul delegat Func returnează o valoare de adevărat sau fals, ceea ce indică dacă parametrul de intrare este egal cu 5.

De asemenea, expresii lambda pot fi folosite atunci când argumentul este de tip Expression. de exemplu, în operatorii de interogare standard așa cum este descris în System.Linq.Queryable. Pentru a determina argumentul Expression expresii Lambda este compilat într-un copac.

Următoarele prezintă o metodă Count. Acesta este operatorul de interogare standard de.

Compilatorul poate deduce tipul de intrare parametrul de intrare; dar poate fi, de asemenea, definite în mod explicit. Acest lambda calculeaza spus întreg (n), care atunci când este împărțit la doi da reziduul 1.

Următoarea linie de cod creează o secvență care conține toate elementele unei matrice de numere. la stânga de 9, deoarece acesta este primul număr din secvență nu este satisfăcătoare:

Acest exemplu arată cum să se determine numărul de parametri de intrare prin bracketing lor. Aceasta metoda returneaza toate elementele din șirul de numere înainte de numărul, a căror valoare este mai mică decât numărul poziției sale. A nu se confunda operatorul lambda (=>), cu un "mai mare sau egal cu" operator (> =).

Tipul de inferență în expresii lambda

Când scrieți expresii lambda, de obicei, nu este necesar să specificați tipul de parametri de intrare, deoarece compilatorul poate acest tip de ieșire bazat pe corp lambda parametru de expresie de tip delegat și de alți factori, așa cum este descris în caietul de sarcini C # limba. Pentru majoritatea operatorilor de interogare standard de prima valoare de intrare are tipul de elemente în secvența originală. Prin urmare, atunci când se solicită IEnumerable variabilă de intrare este considerat a fi obiectul Client. ceea ce înseamnă că aveți acces la metodele și proprietățile sale.

Reguli generale pentru expresii lambda sunt formulate după cum urmează:

lambda expresie trebuie să conțină același număr de parametri ca tipul delegat;

fiecare parametru de intrare în expresia lambda să fie convertibilă implicit la parametrul corespunzător al delegatului;

valoarea returnată unei expresii lambda (dacă există) trebuie să fie convertibilă implicit la tipul de retur delegatului.

Notă: expresii lambda nu au propriile lor de tip, așa cum inițial nici un concept de „lambda“, în sistemul de tip comun. Cu toate acestea, uneori, este convenabil să se opereze cu conceptul de „tip“ așa cum este aplicat la o expresie lambda. În acest caz, în conformitate cu tipul se referă la tipul de tip delegat sau expresie. care este convertit la o expresie lambda.

Domeniul de aplicare al unei variabile în expresiile lambda

expresii Lambda se poate referi la variabilele externe (a se vedea. secțiunea Metode anonime) care sunt în sfera de aplicare a metodei, în care lambda este definită funcția, sau o regiune de tipul care cuprinde o expresie lambda. Variabilele derivate în acest mod sunt stocate pentru a fi utilizate în expresii lambda, chiar dacă ar fi altfel în afara domeniului de aplicare și distruse de către colector de gunoi. variabilă externă trebuie să fie atribuită cu siguranță înainte de a putea fi utilizat în expresii lambda. Următorul exemplu ilustrează aceste reguli.

Următoarele reguli se aplică domeniului de aplicare variabilă în expresii lambda.

Variabilele Capturat nu vor fi distruse de către colectorul de gunoi, atâta timp cât delegatul care face referire, nu intra în starea de a fi distruse de colectare a gunoiului.

Variabilele introduse în expresia lambda nu sunt vizibile în metoda exterioară.

Expresia lambda nu poate capta în mod direct parametrii de ref sau în afara metodei în care acestea sunt situate.

O declarație de întoarcere într-o expresie lambda nu determină valoarea returnată a metodei externe.

Expresia Lambda nu poate conține o declarație goto. de o pauză sau să continue declarația în cadrul funcției Lambda, în cazul în care obiectul țintă este în afara blocului de tranziție. În cazul în care ținta este în interiorul blocului, atunci prezența operatorului de tranziție în afara funcției lambda va fi, de asemenea, o greșeală.

C # Specificații Limba

Pentru mai multe informații, consultați. În caietul de sarcini limbaj C #. Specificarea limbii este sursa definitiv de informații despre sintaxa și utilizarea limbajului C #.

Un capitol important al cărții

articole similare