Învățarea expresiilor lambda în c # - totul despre el și programare

O expresie lambda este un delegat încorporat introdus în C # 3.0. Aceasta este o scurtă reprezentare a metodei fără nume. Oferă sintaxa pentru crearea și apelarea funcțiilor. Cu toate că expresiile lambda sunt mai ușor de utilizat decât metodele fără nume, implementarea acestora este puțin diferită. Ambele metode fără nume și expresii lambda vă permit să definiți o implementare embeddable a metodei, dar metoda anonimă vă solicită în mod explicit să determinați tipurile de parametri și tipul variabilei returnate pentru metodă. Expresia lambda folosește abilitatea de a deduce tipul C # 3.0, permițând compilatorului să emită logic tipul de variabilă în funcție de context.







Expresia lambda poate fi împărțită în parametri cu un cod executabil ulterior, de exemplu:

O expresie lambda vă permite să transmiteți funcții ca argumente la un apel de metodă. Să începem cu un exemplu simplu de expresie lambda care returnează numerele chiar dintr-o listă de numere întregi.

Privind la prima expresie lambda atribuită variabilei variabile, veți observa câteva diferențe față de metodele fără nume. În primul rând, codul nu folosește cuvântul cheie delegat oriunde. În al doilea rând, tipurile parametru și variabila return nu sunt definite, deoarece compilatorul scoate logic tipul bazat pe context. Tipurile din expresie sunt definite de definiția delegatului. În acest caz, tipul variabilei returnate, specificat de metoda FindAll, ia un delegat care ia un parametru int și returnează o valoare booleană. O expresie lambda fără brațele curbate și tipul variabilei returnate este cea mai scurtă cale de a reprezenta o metodă anonimă. Dacă numărul de parametri este unul, puteți omite parantezele din jurul parametrului, așa cum se arată în prima expresie lambda. Deși expresia lambda nu necesită parametri expliciți, puteți defini parametrii, brațele și tipul retur, așa cum se arată în a doua expresie lambda atribuită even2.

Se utilizează un parametru int specific și tipul variabilei care se returnează, specificate de obicei în metodă. Instrucțiunea de returnare nu va funcționa dacă nu închideți codul executabil cu paranteze, având în vedere că ați specificat complet tot ce se referă la metodă.

Un alt loc în care parantezele sunt necesare într-o expresie lambda este atunci când doriți să utilizați un parametru în mai multe blocuri de cod în interiorul unei expresii lambda după cum urmează:

Învățarea expresiilor lambda în c # - totul despre el și programare

În exemplul de cod de mai sus, codul a fost inclus în bretele, astfel încât să puteți utiliza parametrul în ambele expresii. Fără paranteze curbate, compilatorul nu a putut recunoaște variabila i.

Puteți utiliza expresii lambda dacă delegatul nu are parametri. În acest caz, trebuie să specificați o pereche de paranteze goale pentru a indica metoda fără parametri. Mai jos este un exemplu simplu care arată o lambda fără parametri.

Învățarea expresiilor lambda în c # - totul despre el și programare

C # 3.0 definește numărul de delegați generici pe care îi puteți atribui unei expresii lambda în locul cuvântului cheie var care scoate logic tipul. Să luăm în considerare un exemplu de utilizare a mai multor delegați generalizați:

În exemplul de mai sus, se utilizează trei metode de extensie diferite: unde, selectați și selectați. Metoda de extindere în cazul în care ia un delegat generalizat cu parametrul int și tipul logic al variabilei returnate pentru a determina dacă un anumit element va fi inclus în secvența de ieșire. Metoda de selectare a extensiei are un parametru întreg și returnează un număr întreg, dar poate returna tot ceea ce doriți să transformați rezultatul în - înainte de al trimite în secvența de ieșire. În metoda de expansiune ordonată, un întreg parametru este luat și utilizat pentru a determina paritatea sau ciudățenia. Pe baza rezultatelor, rezultatele sunt sortate. Acest lucru ar fi greu dacă ar trebui să definiți trei delegați diferiți pentru fiecare expresie lambda. Datorită introducerii delegațiilor generalizate în C # 3.0, nu este deloc banal să atribuim expresii lambda delegaților generalizați și să delegem acești delegați la metode extensibile. Generali delegați sunt foarte convenabili și ajută la evitarea redactării unor delegați comuni care au fost distribuite în .NET 1.1 și .NET 2.0 (deoarece nu au existat delegați gata făcuți generali). Distribuitorii generalizați vă permit să definiți până la 4 parametri și un tip de variabilă returnată, prin urmare acești delegați sunt utilizați:







Dacă metoda sau delegatul dvs. nu îndeplinește condițiile, va trebui să declarați în mod manual un delegat care acceptă acești parametri. Delegații generice acoperă de obicei cele mai multe scenarii, însă în cazurile în care acestea nu corespund nevoilor dvs., scrieți un delegat personalizat.

Există momente când deducerea de tip nu returnează tipul de date de care aveți nevoie pentru a returna o expresie lambda. În astfel de cazuri, puteți specifica explicit tipul de parametru din expresia lambda. De exemplu:

Expresia de mai sus returnează o eroare de compilator, deoarece atunci când se împarte un dublu, tipul derivat este de fapt dublu. Cu toate acestea, atribuiți o expresie lambda unui delegat care are tipul de variabilă returnată. Dacă, de fapt, doriți să întoarceți un int dintr-o metodă, convertiți corpul expresiei la int pentru a indica intenția dvs., după cum se arată mai jos:

Expresiile Lambda sunt de două tipuri. Prima este o expresie simplă în care totul este ieșit și constă doar dintr-o expresie. Al doilea tip de expresii lambda sunt blocuri de instrucțiuni, constând din paranteze curbate și un tip de returnare. Vom scrie o expresie lambda în ambele forme pentru a vedea diferența:

Să mergem mai departe și să analizăm fiecare expresie lambda alternativ. Prima expresie lambda este o expresie simplă, care nu are un corp de operator, deoarece nu există nicio declarație de întoarcere și bretele curbate, în timp ce a doua expresie lambda conține corpul operatorului, deoarece are o declarație de întoarcere și un braț curbat. Deși ambele expresii sunt compilate într-un delegat, avantajul expresiilor lambda fără corpul operatorului este că ele pot fi transformate într-un arbore de expresie pe care un anumit furnizor îl poate utiliza pentru a-și genera propria implementare. Ca LINQ pentru SQL, aceasta convertește arborele expresiei în limbajul său de domeniu, numit SQL, și îl trimite în baza de date. A treia expresie lambda prezintă diferența dintre expresia lambda și metoda fără nume. Frumusețea acestui operator este că poate fi ușor transformată într-o expresie, în timp ce o metodă fără nume poate fi transformată într-un delegat. Este minunat ca expresia să poată fi transformată într-un delegat prin compilarea expresiei într-un delegat utilizând următoarea sintaxă:

Ultima expresie lambda aruncă o excepție, deoarece compilatorul nu poate converti o expresie lambda care conține corpul operatorului, așa cum este indicat de faptul că este înconjurat de paranteze curbate și o declarație de returnare.

Deși puteți folosi expresii lambda pentru a genera arbori de expresie, nimic nu vă împiedică să vă creați direct arborele de expresie. Să luăm un exemplu de creare a unui arbore de expresie pentru expresia lambda square = x => x * x.

Să începem cu o expresie a unui parametru de tip int.

Următorul pas este de a crea corpul expresiei lambda, care este o expresie binară. Corpul constă din operatorul de multiplicare pentru aceeași expresie de parametru.

Pasul final este de a crea o expresie lambda care conectează corpul la parametru după cum urmează:

Ultimul pas transformă expresia într-un delegat și efectuează delegatul după cum urmează:

Crearea unei expresii dintr-o altă expresie

Puteți să luați un arbore de expresie și să îl modificați pentru a crea o altă expresie din acesta. În exemplul următor, începeți cu expresia lambda x * x, apoi modificați această expresie adăugând la ea 2. Luați în considerare următorul exemplu:

Începem cu o expresie lambda care întoarce un pătrat (pătrat):

Apoi generați corpul expresiei noi lambda folosind corpul primei expresii lambda și adăugând constantul 2 la ea și atribuindu-l expresiei binare:

Închideri și expresii lambda

Închiderea este un concept preluat din programarea funcțională. Acesta captează sau utilizează o variabilă care este în afara sferei expresiei lambda. Acest lucru înseamnă că puteți utiliza variabile în interiorul expresiei lambda declarată în afara sferei de expresie lambda - puteți utiliza și captura o variabilă care este în afara scopului expresiei lambda. Acest lucru are avantajele sale, dar poate provoca probleme, deoarece contextul extern poate schimba valoarea variabilei. Să analizăm un exemplu de expresie lambda cu închidere.

În exemplul de mai sus, variabila mulitplyby este folosită în expresia lambda, deși este declarată în afara scopului expresiei. Acest principiu se numește capturarea unei variabile. În fundal, compilatorul C # ia toate variabilele capturate și le plasează în clasa generată. Atunci când se utilizează expresii lambda cu variabile externe, colectorul de gunoi nu le colectează și există până când sunt utilizate de expresii lambda, iar expresia nu iese din domeniul de aplicare.

Există anumite limitări atunci când se utilizează expresii lambda cu parametrul cu cuvântul cheie ref și out. Dacă variabila este trecută cu cuvântul cheie ref sau out, trebuie să specificați explicit tipul de parametru, deoarece compilatorul nu poate afișa tipul variabilei. După cum se arată în exemplul de mai jos:

Rețineți că codul de mai sus specifică în mod explicit tipul de parametru int în ambele cazuri, ref, și out. Dacă omiteți tipul de parametru, compilatorul va genera o eroare.

O altă limitare la utilizarea lui lambd este că nu puteți utiliza cuvântul cheie paramuri în tipul de parametru pentru expresia lambda, indiferent dacă tipul de parametru este specificat explicit sau nu. Următorul cod nu este compilat, deoarece definirea parametrilor este descrisă de paramurile de cuvinte cheie:

În acest articol s-a luat în considerare sintaxa expresiei lambda - cum înlocuiește metoda fără nume. Se mai spune că expresiile lambda diferă de metodele fără nume datorită inferenței tipurilor și abilității lor de a se transforma cu ușurință în delegați sau copaci de expresie. Au fost studiate limitele parametrilor de expresie lambda și modul de scriere a unei expresii de la zero și de al compila într-un delegat și invers.

• Exemple de cod .NET pe criptologie [sursa - 38.5 KB] [Demo - 9,96 Kb] • Implementarea AES și DES pe C # [sursa - 35,7 KB] [demo - 13.1 KB] 1. Introducere Criptologia - o zonă dedicată de securitate și confidențialitate . Această zonă include multe criptosisteme, fiecare.

Introducere Acest articol explică apelurile metodelor asincrone și modul de utilizare a acestora. După ce ați lucrat cu delegați, fire și un apel asincron, este timpul să împărtășiți cunoștințe despre această problemă. Sunt folosiți pași mici și multe exemple. În general, se va arăta modul de a apela metodele a.

A fost necesar să se creeze o mașină de stat finită pentru produsul curent. Produsul a fost un instrument de management de proiect și, prin urmare, a avut un principiu de activitate bazat pe tranzițiile acțiunilor utilizatorilor de la o stare la alta. De asemenea, a fost necesar ca aparatul de stare să fie configurabil pentru / diferit.







Articole similare

Trimiteți-le prietenilor: