C#7 — интервью с Jesse Liberty и Андреем Акиньшиным
Jesse Liberty известен как автор многочисленных книг. Кроме того, он автор множества курсов на Pluralsight, сертифицированный Xamarin Developer, Microsoft и Xamarin MVP.
В последнее время интересуется технологиями Xamarin, Angular 2 и ASP.NET Core. Ведет подкаст под названием Yet Another Podcast, в котором разговаривает с интересными персонами из мира разработки ПО и игр.
Нам удалось поговорить с ним о будущем релизе C# 7.0 и о его выступлении на DotNext в Москве. Удалось задать несколько неожиданных вопросов и Андрею Акиньшину, разработчику новой С# IDE Rider в JetBrains.
Андрей Акиньшин
.NET MVP, к.ф.-м.н., серебряный призёр ACM ICPC, один из разработчиков Rider в JetBrains.
Увлекается микрооптимизациями. Мейнтейнер проекта BenchmarkDotNet.
В свободное время любит разбираться во внутренностях .NET и делиться находками с сообществом.
— Когда наконец-то планируется релиз 7-ой версии языка?
— Сложно сказать, когда. Работа над 7-кой ведется уже давно. Более или менее известен список фич, которые должны войти в 7-ку. Есть разные фичи, которые еще обсуждаются, и непонятно, будут они доступны или нет. В случае с Microsoft предсказать какие-то реальные сроки достаточно сложно. Работа все еще ведется, команда разработчиков постоянно вносит какие-то изменения. От каких-то решений отказываются, вводят некоторые новые интересные вещи. Но очень надеюсь, что в обозримом будущем версия будет выпущена.
— Но что-то уже доступно?
— Да, если вы установите preview следующей версии студии под кодовым названием Visual Studio »15 (не путать с 2015-ой), то там есть превьюшка, с которой уже можно поиграться, но, памятуя о том, как разрабатывалась 6-ка, я этим не занимался и жду официального релиза, чтобы развлекаться со стабильной версией.
Можно оставить фидбэк команде разработчиков. Что мне очень нравится в новой политике Microsoft — это то, что сейчас они очень активно взаимодействуют с community. Если раньше вся разработка шла за закрытыми дверями и мы узнавали о новых фичах языка после его выхода, то сейчас реально ведется работа с community. Разработчикам интересно мнение обычных людей, которые будут пользоваться этим языком. Какие фичи более удобны, какие менее. Что лучше включить в язык.
И дальше уже на основе того, что тяжело добавить, что легко добавить, они принимают решение о том, как язык будет выглядеть. Поэтому, если есть энтузиасты, которые очень любят развлекаться с превьюшками и которым хочется повлиять на финальную версию C# 7, то можно скачать превью, посмотреть и оставить на github-е feedback.
— Это вы предвидели второй вопрос. Как можно узнать о новых возможностях заранее? Может быть, существуют какие-то секретные ресурсы или программы? Я смог найти только ветку дискуссии на github.
— Есть один центральный репозиторий на github, в котором и ведутся все обсуждения. Все обсуждения ведутся публично, есть рабочий список фич, которые предлагается ввести в язык, и я думаю, что уже каких-то новых фич, взявшихся ниоткуда, не будет.
Более или менее понятно, чего хочет народ, осталось только понять, как это правильно реализовать, чтобы всем было удобно. И реализовать.
Потому что многие фичи достаточно сложны именно с точки зрения имплементации в компиляторе Roslyn.
А так никаких секретов нет, все полностью открыто. Пожалуйста — любой может принять участие в обсуждении.
Jesse Liberty
— Когда будет релиз C# 7-ой версии?
— C# 7.0 будет выпущен с тем, что сейчас называется Visual Studio 15. Пока что прямой даты релиза нигде нет. Но он в превью 4 прямо сейчас.
Примечание: Разговор происходил буквально за пару дней до релиза VS 15 preview 5.
— Как многое уже доступно для ознакомления?
— Что ж, в превью 4 доступно уже достаточно, но некоторые фичи пока реализованы лишь частично
— Мне всегда было интересно, как можно узнавать о новых возможностях заранее. Может быть, существуют какие-то закрытые группы или программы, в которых можно принять участие? Все, что я смог найти, это ветка дискуссии на github.
— Есть очень хороший пост в блоге, который написал Mads Torgersen. Это то, на чем я основываю свою презентацию. Я неоднократно говорил с Мэдсом, у меня есть и подкаст с ним, это будет, пожалуй, хорошей отправной точкой.
— Спасибо! У меня в копилке уже есть эта ссылка. И мой следующий вопрос об этом топике в блоге. Если я ее прочитаю (и что немаловажно, пойму), то смогу ли я услышать много нового на вашем докладе? Или, может быть, мне наоборот желательно почитать и вникнуть заранее, иначе я не смогу понять, о чем вы будете рассказывать?
— Что ж, эта статья, если вы говорите об этой самой статье Мэдса, была написана в августе. Так вот, уже было несколько обновлений с тех пор, и будет еще больше обновлений ко времени презентации. Кроме того, подкаст вышел позднее статьи, так что есть информация, которая есть в подкасте, но которой нет в статье. Надеюсь, моя презентация даст вам более свежие знания.
— ОК. Спасибо. Я тоже думаю, что в презентации будет что-то новое.
— Ага.
— Я знаю, что вы используете C#, начиная с первой версии этого языка.
— Да, я перешел на C# в 2000-ом.
Отличия 7-й версии
— Может быть, вы можете как-то сравнить версию 7 и предыдущие версии? У 7-ой больше возможностей или, возможно, они более важны?
— С 6-ой до 7-ой есть несколько очень важных добавлений. Паттерны и tuples, наверное, два самых важных из них. Кроме того, есть несколько удобных дополнений.
Но tuples и паттерны вносят в язык весьма значительные изменения.
Паттерны позволяют колоссально сократить сам способ программирования, разрешая нам, помимо всего прочего, совпадения по типу, такие же как в if или switch конструкциях.
Другая ключевая фича в C# 7 это tuples — возможность вернуть больше, чем одно значение из метода. Мы всегда могли это сделать ранее с помощью out-параметра, но tuples
- более понятны
- вы можете декларировать их как типы
Также они более гибкие и высокоэффективные.
Еще вы можете разделить tuples с помощью процесса, называемого Deconstruction, который позволяет вам разделить tuple или какое-то другое значение на составные части.
— Я слушал ваш подкаст и пример по поводу использования tuples. Сейчас tuples стали мне гораздо понятнее. Обычно какие-то функции гораздо проще понять с помощью «use case-ов». Может быть, вы собираетесь рассказать о каких-то примерах во время выступления в Москве?
— Да. Безусловно.
— В C# 6 возможность использования await была добавлена в блок catch. В 7 она будет добавлена в метод Main?
— Я не видел этого в планах на 7, но может быть.
Новые возможности
Есть еще одна новинка в 7-ке — функции внутри функций.
— Это замечательно. Так же, как и в Javascript, верно?
— Да.
— Какая фича вам нравится больше всего из этого релиза или, возможно, из следующего?
— Я думаю, что те две, которые я уже упомянул, наиболее значительные и интересные — добавление tuples и добавление паттернов. Эти две, я думаю, изменят сам стиль нашего программирования на манеру, которая более интересна, в отличие от множества других дополнений. Например, out-параметры удобны, но они не изменят стиля программирования.
Улучшения литералов будут довольно хорошей фичей, но на стиле программирования тоже не отразятся. Deconstruction, как я уже упоминал. Deconstruction относится к tuples.
Я жду с нетерпением следующего превью, когда какой-то функционал из описанных выше будет наконец-то работать. Сейчас у некоторых из этих фич все еще есть некоторые ограничения.
— Для поиска информации я использовал эту github-ссылку
Насколько я понял, автор — Мэдс Торгерсен. И это дискуссия по поводу новых фич.
— Это еще от июня, да. Но некоторые фичи, которые там обсуждаются, не будут представлены в 7-ой версии. Давайте посмотрим: должны сделать локальные функции, tuples хотят сделать, паттерны сделают, reference locals и reference returns — не уверен, replace/original (part of generators) — не уверен даже, что в курсе, что это такое. Посмотрим, что там ещё: digital separators — полагаю, сделают, и out переменные сделают. И я не знаю, что насчет асинхронного Main и «адресация статичного метода для небезопасного interop кода» — не думаю, что это в 7-ке.
Wildcards
— В тексте, что вы упомянули, некоторые пункты рассматриваются только мельком. Например, мне не совсем понятно, что такое «wildcards» в качестве out-параметров.
— Идея в том, чтобы вставить символ звездочки, что позволит вам игнорировать любой out-параметр, о котором вы не хотите тревожиться. Еще не ясно, будут ли wildcards в C# 7 или нет.
— Есть ли (планируются ли) какие-либо изменения или новые фичи в C#, необходимые по причине того, что язык стал кроссплатформенным (я имею в виду, после выхода .NET Core и приобретения Xamarin)?
— Я думаю, нет. C# уже работает идентично на MacOS. Вы можете видеть это в Xamarin Studio для Mac. По моему мнению, ключевое изменение, которое необходимо, это перенос Visual Studio на Mac.
— Новым функциям всегда рады, но изменения языка могут иногда замутить воду. Я знаю, что в конструкции switch порядок выполнения был изменен. Если ли какие-то еще изменения в C#, которые могут запутать?
— Порядок выполнения в конструкции case не был изменен в конструкции switch, но он стал важен при использовании условий when. Это не критическое изменение.
И, да, есть новые функции. И люди должны решать, будут ли они использовать новые функции или подождут.
Нет никаких критических изменений, из ядра функции не удалялись, но что-то было улучшено. Например, сейчас вы можете исключить case-ы соответствия в конструкции switch, так что вы можете указать case типа number, где number более, чем 100. Это довольно высокоэффективное изменение в конструкции switch.
— Выходит, что никаких новых багов не будет по причине изменений?
— Нет, нет. Это никак не поломает код. Никаких критических изменений нет.
— Большое вам спасибо! Был рад с вами поговорить.
— Thank you. Спасибо.
Если вы хотите услышать только проверенную информацию с объяснениями и примерами о нововведениях, которые точно будут в новой версии C#, тогда приходите на конференцию DotNext, которая будет проходить в Москве 9 декабря.
Список докладов:
⬝ .NET Core: State of the art
⬝ Squeezing the Hardware to Make Performance Juice
⬝ Интеллектуальные чатботы и когнитивные сервисы
⬝ Stack Overflow — It’s all about performance!
⬝ Advanced Xamarin.Forms
⬝ C++ через C#
⬝ Продолжаем говорить про арифметику
⬝ ASP.NET SignalR: Why It’s Getting Really Crucial for Web Development
⬝ Exceptional Exceptions in .NET
⬝ Модификация кода .NET в рантайме
⬝ End-to-end JIT
⬝ Performance tuning Stack Overflow tags
⬝ C# Scripting — why and how you can use your C# in places you never thought of before!
⬝ Multithreading Deep Dive
⬝ Собрать всё, или Знакомимся с Cake (C# Make)
⬝ WinDbg Superpowers for .NET Developers
⬝ Overview of the new .NET Core and .NET Platform Standard
⬝ Какие уязвимости находят в .NET платформе и как не повторить их в своих приложениях
⬝ What’s new in C# 7?
⬝ ETW — Monitor Anything, Anytime, Anywhere