Thursday, April 18, 2024 04:35

Cuprins >> LINQ > Clauze Select degenerate

Clauze Select degenerate

Luând un extras din lecțiile anterioare despre LINQ, aveam aceste coduri:


Dacă ați acordat atenție codului de mai sus, probabil că ați observat funcția Select(n => n). Dacă o analizați puțin, vă dați seama că este o expresie lambda care nu face decât să preia un parametru numit n și să-l returneze, fără nici o modificare.

Pentru a dovedi asta, îmi voi crea propria versiune a funcției Select():

Vizualizează schimbări cod


Legendă:

  • liniile verzi cu un semn plus lângă numerele liniilor sunt linii noi adăugate
  • liniile rosii cu un semn minus lângă numerele liniilor sunt linii vechi șterse



În acest caz, a trebuit să modific ușor semnătura funcției Select() pentru a fi o metodă de extensie pentru IEnumerable<int>, deoarece funcția Where(), care îi furnizează numerele, returnează un IEnumerable<int> și nu un array de tip int.

Dacă în interiorul metodei mele Main() aș fi avut ceva de genul Select(n => n + 5), asta ar fi însemnat de fapt că iau n ca parametru și returnez n + 5, transformând efectiv n. Dar în cazul nostru, avem Select(n => n), ceea ce înseamnă practic „ești un int, tranformă-te într-un int”. Nu este implicată nicio transformare, ceea ce înseamnă practic că irosim timpul CPU-ului.

În sintaxa în formă liberă a LINQ, suntem obligați să o scriem, totuși:

Cu toate acestea, compilatorul este suficient de inteligent pentru a realiza că acest „hei, iată ceva, dă-l înapoi, iată ceva, dă-i înapoi” este cu totul inutil. Și îl elimină, atunci când traduce interogarea în cod MSIL normal. Ceea ce înseamnă că îl putem elimina și noi, în forma de sintaxă declarativă:

Vizualizează schimbări cod


Legendă:

  • liniile verzi cu un semn plus lângă numerele liniilor sunt linii noi adăugate
  • liniile rosii cu un semn minus lângă numerele liniilor sunt linii vechi șterse


Desigur, putem rula programul și putem vedea că acesta produce aceeași ieșire:

Acest tip de funcții care nu fac cu adevărat nimic și sunt eliminate de compilator se numesc clauze degenerate. Și nu numai că este mai ușor să scrieți interogări LINQ în sintaxa declarativă, dar este și mai scurt: o linie de cod, în comparație cu trei linii, în cazul sintaxei în format liber. Acesta este și motivul pentru care majoritatea programatorilor îl preferă pe cel declarativ, în timp ce cel în formă liberă este preferat în special de cei care provin dintr-un mediu de dezvoltare de baze de date.

Tags: , ,

Leave a Reply



Follow the white rabbit