Про підтримку мовних фич c # в visual studio і в coderush for roslyn

C # постійно розвивається. Навесні вийшла вже сьома версія. У цій статті буде огляд підтримки останніх фіч C # в CodeRush for Roslyn. Про C # 7.0 вже було кілька публікацій на Хабре, тому основна увага саме на те, як це підтримується в CodeRush for Roslyn.

Бонусом, в кінці статті, дамо рецепт для тих, хто з якихось причин не хоче використовувати нові мовні фичи.

Task-like повертаються типи асинхронних методів

Якщо раніше асинхронний метод міг повертати тільки типи Task або Task. то тепер можливо оголосити власні Task -like типи, які можна використовувати в повертаються значеннях асинхронних методів.

По-перше, давайте перевіримо як працюють фичи всередині асинхронного методу, який повертає Task -like тип. Наприклад, для методу з одним параметром спробуємо викликати Exit Method Contract:

Про підтримку мовних фич c # в visual studio і в coderush for roslyn

Як бачимо, CodeRush for Roslyn коректно визначив, що return-оператор повинен бути порожнім і не повинен містити ніякого виразу, тому що в даному випадку повертається тип не є універсальним (не містить параметрів типу). Інші фичи, які генерують return-оператора також працюють коректно. Як приклад, давайте подивимося як відпрацює шаблон "r", який викликає Smart Return. всередині асинхронного методу:

В цьому випадку CodeRush правильно розпізнав, що в return-оператора повинно міститися вираз типу ArgumentKind і вставив відповідне значення за замовчуванням.

Другий момент - це фичи, які використовують await -виражена з викликом асинхронного методу, який повертає Task -like тип. Як видно на наступному скріншоті, CodeRush правильно визначає тип таких await -виражена:

Про підтримку мовних фич c # в visual studio і в coderush for roslyn

кортежі значень

Мабуть, це нововведення в специфікаціях мов претендує на роль самого затребуваного. Тепер за допомогою зручного синтаксису можна оголошувати типи, які є кортежами кількох значень. Можна задавати як просто типи елементів, так і їх імена. Для майбутніх релізів у нас є кілька ідей щодо найбільш великої підтримки кортежів: визначати і видаляти невикористовувані пункти, змінювати пункти місцями, використовувати кортежі в рефакторінгу 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

Також і зворотні даному рефакторингу Expand Method і Expand Accessor доступні, якщо використаний новий синтаксис.

Про підтримку мовних фич c # в visual studio і в coderush for roslyn

Use Expression Body доступний тепер і в тих випадках, коли в тілі методу / акcессора відсутня імплементація і присутній лише виклик винятку. З появою throw-expression запис таких методів можна зробити коротше і наочніше:

Про підтримку мовних фич c # в visual studio і в coderush for roslyn

Ще один випадок, де throw-expression підвищує наочність коду - це тернарние оператори. Тепер if / else -вираження, в якому в залежності від умови або викликається виключення, або повертається / присвоюється якесь значення, можна замінити одним вираз з тернарного оператором. Допоможе в цьому рефакторинг Compress to Ternary Expression:

Про підтримку мовних фич c # в visual studio і в coderush for roslyn

Зворотний рефакторинг Expand Ternary Expression звичайно ж також буде доступний на виразах з throw-expression:

Про підтримку мовних фич c # в visual studio і в coderush for roslyn

Зіставлення зі зразком

Теж дуже потужне нововведення, яке, впевнений, вже полюбилося багатьом користувачам. Воно дозволяє в операторах if і case перевірити, що змінна є об'єктом певного типу і тут же оголосити змінну цього типу, уникаючи зайвого кастингу. У case-оператора на додаток до цього можна здійснити додаткові перевірки в when -виражена.

В даному розділі ми теж поки не втілили всі свої ідеї. Як приклад того, що вже є, продумонстріруем роботу фичи Declare Class на case -виражена, в якому використаний новий синтаксис:

В даному випадку CodeRush for Roslyn коректно визначив, що тут використовується шаблон типу, а також відразу задекларував властивість, що використовується в when -виражена. Давайте тепер налагодимо даний метод при цьому включимо CodeRush Debug Visualizer:

Про підтримку мовних фич c # в visual studio і в coderush for roslyn

Коли відладчик доходить до 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

Наприклад, якщо поставити C # 4.0, то контекстне меню зміниться, тому що інтерполяцію рядків придумали в C # 6.0.

Про підтримку мовних фич c # в visual studio і в coderush for roslyn

Але ми не просто приховуємо підтримуються пункти меню за умовою, ми реалізуємо повноцінну підтримку потрібної версії мови на в тому числі на рівні генерації коду.

Наприклад, якщо в проекті варто версія C # 6.0, то Declare Comparison members з Declare Menu згенерувати код таким чином:

А в C # 3.0, наприклад, nameof () ще не було, і код буде таким:

За рахунок використання штатних парсеров студії CodeRush for Roslyn однаково добре підтримує як нові можливості C #, так і старі. CodeRush значно розширює можливості Visual Studio не забарився її. Особливо це помітно на серйозних enterprise-проектах з великим об'ємом коду.

Завантажити спробувати CodeRush for Roslyn можна на нашому сайті.

Схожі статті