C # постійно розвивається. Навесні вийшла вже сьома версія. У цій статті буде огляд підтримки останніх фіч C # в CodeRush for Roslyn. Про C # 7.0 вже було кілька публікацій на Хабре, тому основна увага саме на те, як це підтримується в CodeRush for Roslyn.
Бонусом, в кінці статті, дамо рецепт для тих, хто з якихось причин не хоче використовувати нові мовні фичи.
Task-like повертаються типи асинхронних методів
Якщо раніше асинхронний метод міг повертати тільки типи Task або Task
По-перше, давайте перевіримо як працюють фичи всередині асинхронного методу, який повертає Task -like тип. Наприклад, для методу з одним параметром спробуємо викликати Exit Method Contract:
![Про підтримку мовних фич c # в visual studio і в coderush for roslyn (підтримки) Про підтримку мовних фич c # в visual studio і в coderush for roslyn](https://images-on-off.com/images/159/opodderzhkeyazikovixfichcvvisualstudioiv-fdea1044.png)
Як бачимо, CodeRush for Roslyn коректно визначив, що return-оператор повинен бути порожнім і не повинен містити ніякого виразу, тому що в даному випадку повертається тип не є універсальним (не містить параметрів типу). Інші фичи, які генерують return-оператора також працюють коректно. Як приклад, давайте подивимося як відпрацює шаблон "r", який викликає Smart Return. всередині асинхронного методу:
В цьому випадку CodeRush правильно розпізнав, що в return-оператора повинно міститися вираз типу ArgumentKind і вставив відповідне значення за замовчуванням.
Другий момент - це фичи, які використовують await -виражена з викликом асинхронного методу, який повертає Task -like тип. Як видно на наступному скріншоті, CodeRush правильно визначає тип таких await -виражена:
![Про підтримку мовних фич c # в visual studio і в coderush for roslyn (studio) Про підтримку мовних фич c # в visual studio і в coderush for roslyn](https://images-on-off.com/images/159/opodderzhkeyazikovixfichcvvisualstudioiv-511cd8d4.png)
кортежі значень
Мабуть, це нововведення в специфікаціях мов претендує на роль самого затребуваного. Тепер за допомогою зручного синтаксису можна оголошувати типи, які є кортежами кількох значень. Можна задавати як просто типи елементів, так і їх імена. Для майбутніх релізів у нас є кілька ідей щодо найбільш великої підтримки кортежів: визначати і видаляти невикористовувані пункти, змінювати пункти місцями, використовувати кортежі в рефакторінгу Convert to Tuple і ін. Поки ж є підтримка кортежів в уже наявних фічах. Продемонструємо це на прикладі рефакторінга Add Parameter:
Рефакторинг коректно розпарсити введене значення як кортеж з SortingKind і SortingOrder і в якості дефолтного значення підставив кортеж з дефолтних значень цих типів.
В якості ще одного прикладу продемонструємо роботу фичи Smart Return. яка викликається розкриттям шаблону r:
Як бачимо, CodeRush for Roslyn використовує імена для змінних кортежу, якщо вони були оголошені.
Вкладені локальні функції
Часом виникає необхідність написання допоміжної функції використання, якої обмежено певним методом. У C # 7 можливо оголосити локальну функцію прямо в тілі методу. Локальні функції схожі з лямбда-виразами, але найчастіше код використання локальних функцій є більш наочним і зрозумілим.
По-перше, ми оновили фичу Naming Assistant щоб вона працювала з локальними функціями:
А ще, вже знайомий Add Parameter теж тепер працює з новим синтаксисом:
Рефакторинг правильно знайшов декларацію і всі посилання і додав параметр в потрібні позиції.
Розширення використання expression-body і throw-expression
Думаю, що багатьом припала до душі використання expression-body в C # 6, тепер список елементів, де він може бути розширений акцессорамі властивостей, конструкторами і деструкторами. Рефакторинг Use Expression Body доступний на нових елементах:
![Про підтримку мовних фич c # в visual studio і в coderush for roslyn (coderush) Про підтримку мовних фич c # в visual studio і в coderush for roslyn](https://images-on-off.com/images/159/opodderzhkeyazikovixfichcvvisualstudioiv-cd872cef.png)
Також і зворотні даному рефакторингу Expand Method і Expand Accessor доступні, якщо використаний новий синтаксис.
![Про підтримку мовних фич c # в visual studio і в coderush for roslyn (підтримки) Про підтримку мовних фич c # в visual studio і в coderush for roslyn](https://images-on-off.com/images/159/opodderzhkeyazikovixfichcvvisualstudioiv-d459bf3d.png)
Use Expression Body доступний тепер і в тих випадках, коли в тілі методу / акcессора відсутня імплементація і присутній лише виклик винятку. З появою throw-expression запис таких методів можна зробити коротше і наочніше:
![Про підтримку мовних фич c # в visual studio і в coderush for roslyn (coderush) Про підтримку мовних фич c # в visual studio і в coderush for roslyn](https://images-on-off.com/images/159/opodderzhkeyazikovixfichcvvisualstudioiv-cb0bb00b.png)
Ще один випадок, де throw-expression підвищує наочність коду - це тернарние оператори. Тепер if / else -вираження, в якому в залежності від умови або викликається виключення, або повертається / присвоюється якесь значення, можна замінити одним вираз з тернарного оператором. Допоможе в цьому рефакторинг Compress to Ternary Expression:
![Про підтримку мовних фич c # в visual studio і в coderush for roslyn (підтримки) Про підтримку мовних фич c # в visual studio і в coderush for roslyn](https://images-on-off.com/images/159/opodderzhkeyazikovixfichcvvisualstudioiv-43c8b353.png)
Зворотний рефакторинг Expand Ternary Expression звичайно ж також буде доступний на виразах з throw-expression:
![Про підтримку мовних фич c # в visual studio і в coderush for roslyn (.net) Про підтримку мовних фич c # в visual studio і в coderush for roslyn](https://images-on-off.com/images/159/opodderzhkeyazikovixfichcvvisualstudioiv-f8d57a5c.png)
Зіставлення зі зразком
Теж дуже потужне нововведення, яке, впевнений, вже полюбилося багатьом користувачам. Воно дозволяє в операторах if і case перевірити, що змінна є об'єктом певного типу і тут же оголосити змінну цього типу, уникаючи зайвого кастингу. У case-оператора на додаток до цього можна здійснити додаткові перевірки в when -виражена.
В даному розділі ми теж поки не втілили всі свої ідеї. Як приклад того, що вже є, продумонстріруем роботу фичи Declare Class на case -виражена, в якому використаний новий синтаксис:
В даному випадку CodeRush for Roslyn коректно визначив, що тут використовується шаблон типу, а також відразу задекларував властивість, що використовується в when -виражена. Давайте тепер налагодимо даний метод при цьому включимо CodeRush Debug Visualizer:
![Про підтримку мовних фич c # в visual studio і в coderush for roslyn (підтримки) Про підтримку мовних фич c # в visual studio і в coderush for roslyn](https://images-on-off.com/images/159/opodderzhkeyazikovixfichcvvisualstudioiv-2e3fd46f.png)
Коли відладчик доходить до switch-оператора, Debug Visualizer обчислює вираження у всіх case -ветках і відображає яка з них буде виконуватися в даному випадку, роблячи код інших гілок більш бляклим. Це робить налагодження коду більш наочною і зручною, показуючи який код буде виконуватися на наступному кроці.
Повернення за посиланням
Візьмемо зв'язку з двох уже знайомих нам фич: Smart Return і Declare Method і подивимося як вони відпрацюють в методі, який повертає значення за посиланням:
Smart Return підставив ключове слово ref, оскільки return-оператор повинен містити ref-вираз в даному випадку. Declare Method. визначивши, що метод викликається в ref-вираженні, коректно оголосив повертається тип як ref int.
бінарні літерали
Тепер значення якихось констант в коді можна задавати, використовуючи двійковий код. Це може бути зручним в перерахування. CodeRush має в своєму арсеналі фичу, яка дозволяє прискорити і спростити завдання додавання нового елемента - Smart Duplicate Line. Досить натиснути Shift + Enter і CodeRush додасть новий елемент, виділивши текстовими полями ті елементи, які зажадають змін:
І обіцяний бонус
Мало хто знає, але на рівні проекту можна вибирати версію мови. CodeRush for Roslyn враховує опцію Build | Advanced | Language Version.
![Про підтримку мовних фич c # в visual studio і в coderush for roslyn (studio) Про підтримку мовних фич c # в visual studio і в coderush for roslyn](https://images-on-off.com/images/159/opodderzhkeyazikovixfichcvvisualstudioiv-418c4597.png)
Наприклад, якщо поставити C # 4.0, то контекстне меню зміниться, тому що інтерполяцію рядків придумали в C # 6.0.
![Про підтримку мовних фич c # в visual studio і в coderush for roslyn (підтримки) Про підтримку мовних фич c # в visual studio і в coderush for roslyn](https://images-on-off.com/images/159/opodderzhkeyazikovixfichcvvisualstudioiv-bb07fe3f.png)
Але ми не просто приховуємо підтримуються пункти меню за умовою, ми реалізуємо повноцінну підтримку потрібної версії мови на в тому числі на рівні генерації коду.
Наприклад, якщо в проекті варто версія C # 6.0, то Declare Comparison members з Declare Menu згенерувати код таким чином:
А в C # 3.0, наприклад, nameof () ще не було, і код буде таким:
За рахунок використання штатних парсеров студії CodeRush for Roslyn однаково добре підтримує як нові можливості C #, так і старі. CodeRush значно розширює можливості Visual Studio не забарився її. Особливо це помітно на серйозних enterprise-проектах з великим об'ємом коду.
Завантажити спробувати CodeRush for Roslyn можна на нашому сайті.