Î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
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
O instanță a unui delegat poate fi creat de func
De asemenea, expresii lambda pot fi folosite atunci când argumentul este de tip Expression
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
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 #.