C # evoluează în mod constant. În primăvară a existat deja a șaptea versiune. Acest articol va examina suportul pentru cele mai noi caracteristici ale C # din CodeRush pentru Roslyn. Au existat deja mai multe publicații pe C # 7.0 pe Habr, astfel încât accentul principal este exact cum este susținut în CodeRush pentru Roslyn.
Bonus, la sfârșitul articolului, vom da o rețetă pentru cei care, din anumite motive, nu vor să folosească funcții noi de limbă.
S-au întors tipuri de metode asincrone de întoarcere
Dacă anterior o metodă asincronă poate returna numai tipurile Task sau Task
Mai întâi, să verificăm modul în care funcțiile funcționează în cadrul metodei asincrone, care returnează un tip de tip Task. De exemplu, pentru o metodă cu un parametru, încercați să apelați Contractul pentru metoda de ieșire:
După cum puteți vedea, CodeRush pentru Roslyn a definit corect că operatorul de retur trebuie să fie gol și nu trebuie să conțină nici o expresie, deoarece în acest caz, tipul retur nu este universal (nu conține parametri de tip). Alte funcții care generează return-operatori funcționează corect. De exemplu, să vedem cum funcționează modelul "r" care solicită returnarea inteligentă. în cadrul metodei asincrone:
În acest caz, CodeRush a recunoscut corect că operatorul de retur trebuie să conțină o expresie de tip ArgumentKind și să introducă valoarea implicită corespunzătoare.
Al doilea punct este caracteristica care utilizează expresii așteptate prin invocarea unei metode asincrone care returnează un tip de tip Task. După cum puteți vedea în următoarea captură de ecran, CodeRush definește corect tipul de astfel de expresii așteptate:
Capcane de valori
Poate că această inovație în specificațiile limbajului se preface a fi cea mai populară. Acum, folosind sintaxa convenabilă, puteți declara tipuri care sunt tuple de mai multe valori. Puteți specifica atât tipurile de elemente, cât și numele acestora. Pentru versiuni viitoare, avem cateva idei pe suport mai extinsă pentru tupluri :. Identifica și șterge elemente neutilizate, elemente de swap, utilizați tuplele în refactorizare Conversia la tuple etc. Între timp, există un sprijin pentru tuple în fichah existente. Să demonstrăm acest lucru cu exemplul refactorizării Add Parameter:
Refactoringul a analizat corect valoarea introdusă ca tuplă din SortingKind și SortingOrder și, ca valoare implicită, a înlocuit o tuplă cu valorile implicite ale acestor tipuri.
Ca un alt exemplu, demonstrăm activitatea Smart Return. care este numit de r:
După cum puteți vedea, CodeRush pentru Roslyn folosește nume pentru variabilele tuplei, dacă au fost declarate.
Funcții locale nestecate
Uneori este nevoie de scrierea unei funcții auxiliare, care este limitată la o anumită metodă. În C # 7, este posibilă declararea unei funcții locale direct în corpul metodei. Funcțiile locale sunt similare cu expresiile lambda, dar adesea codul pentru utilizarea funcțiilor locale este mai intuitiv și mai ușor de înțeles.
În primul rând, am actualizat caracteristica Naming Assistant astfel încât să funcționeze cu funcțiile locale:
De asemenea, parametrul deja adăugat de adăugare a parametrului funcționează acum și cu noua sintaxă:
Refactorizarea a găsit corect declarația și toate legăturile și a adăugat parametrul la pozițiile necesare.
Extinderea utilizării expresiei-corp și aruncare-exprimare
Cred că mulți au avut în vedere să folosească expresia corp în C # 6, este acum o listă de elemente, în cazul în care acesta poate fi extins și proprietăți setter, constructori si destructori. Refactoring Use Expression Body este disponibil pe elemente noi:
De asemenea, inversarea acestei metode de refărare Expand Method și Expand Accessor este disponibilă dacă se utilizează o nouă sintaxă.
Folosiți Expression Body este acum disponibil atunci când nu există o implementare în corpul metodei / codorului și există doar un apel de excepție. Odată cu apariția arderii, înregistrarea acestor metode poate fi mai scurtă și mai clară:
Un alt caz în care expresia margine crește vizibilitatea codului - este operatorul ternar. Acum, dacă / altceva -vyrazhenie în care, în funcție de condițiile sau aruncă o excepție sau întoarce / i se atribuie o valoare, puteți înlocui o expresie cu operatorul ternar. Comprimați expresia Ternară vă va ajuta în acest mod:
Reverse refactoring Expand Ternar Expresia, desigur, va fi disponibila si pe expresii cu expresie aruncata:
Comparație cu eșantionul
De asemenea, o inovație foarte puternică, care, sunt sigur, deja îi place multor utilizatori. Aceasta permite operatorilor să verifice dacă variabila este un obiect de un anumit tip și să declare imediat o variabilă de acest tip, evitând turnarea inutilă. În cazul operatorilor, în plus față de acestea, puteți efectua verificări suplimentare în timpul expresiei.
În această secțiune, nu am implementat încă toate ideile noastre. Ca un exemplu al celor deja disponibile, să aruncăm o privire asupra funcționării funcției Declarație de clasă asupra expresiei de caz, care folosește noua sintaxă:
În acest caz, CodeRush pentru Roslyn corect determinată că utilizează un tip de șablon, și să declare imediat o proprietate atunci când sunt utilizate în -vyrazhenii. Să debugăm acum această metodă, permițând vizualizatorului de eroare CodeRush Debug:
Când debuggerul ajunge la comutator, Visualizer-ul de depanare evaluează expresiile în toate cazurile și afișează unul care va fi executat în acest caz, făcând codul pentru ramurile rămase mai luminoase. Aceasta face ca depanarea codului să fie mai intuitivă și mai convenabilă, indicând ce cod va fi executat în pasul următor.
Întoarceți prin referință
Să luăm o grămadă de două caracteristici deja familiare: Metoda Return Return și Declare și să vedem cum funcționează într-o metodă care returnează o valoare prin referință:
Interogarea inteligentă a înlocuit cuvântul cheie ref, deoarece declarația de returnare trebuie să conțină o ref-expresie în acest caz. Declarați metoda. determinând că metoda este denumită în ref-expresie, a declarat corect tipul de returnare ca ref int.
Biblice literale
Acum, valorile unor constante din cod pot fi specificate folosind un cod binar. Acest lucru poate fi convenabil în enumerări. CodeRush are o caracteristică în arsenalul său care vă permite să accelerați și să simplificați sarcina de a adăuga un element nou - Smart Duplicate Line. Este suficient să apăsați Shift + Enter și CodeRush va adăuga un element nou, evidențiind cu câmpurile de text acele elemente care vor necesita modificări:
Și bonusul promis
Puțini oameni știu, dar la nivel de proiect, puteți alege versiunea lingvistică. CodeRush pentru Roslyn ia în considerare Build | Avansat | Versiunea lingvistică.
De exemplu, dacă puneți C # 4.0, meniul contextual se va schimba, deoarece interpolarea șirurilor a fost inventată în C # 6.0.
Dar nu ascundem elementele de meniu neacceptate de condiție, implementăm suport complet pentru versiunea necesară a limbii, inclusiv la nivelul generării codului.
De exemplu, dacă proiectul are o versiune C # 6.0, atunci membrii Declare Comparison din meniul Declare vor genera codul astfel:
Și în C # 3.0, de exemplu, nameof () nu a fost încă, iar codul va fi astfel:
Folosind parserii obișnuiți ai studioului, CodeRush pentru Roslyn susține la fel de bine atât noile caracteristici ale lui C # cât și cele vechi. CodeRush extinde foarte mult capabilitățile Visual Studio fără a încetini acest lucru. Mai ales se observă în cazul proiectelor grave de întreprindere cu o cantitate mare de cod.
Puteți descărca CodeRush for Roslyn pe site-ul nostru.