Новая Зеландия и Веллингтон особенно невелики, поэтому, когда руководитель программ языка C # приезжает в город на встречу, было бы стыдно оставаться дома.

В эту среду на удивительной встрече WelliDotNet были Мэдс Торгерсен; парень, ответственный за разработку языка C # (а в прошлом - за TypeScript и Visual Basic); и он рассказал о новых возможностях C # 7.0 и о том, куда движутся следующие версии.

Мэдс начал с результатов Stack Overflow Developer Survey 2017, в которых C # является 4-м наиболее часто используемым языком программирования.

И он также вошел в десятку самых любимых языков программирования.

Он считает, что причины этого

  • C # теперь работает на всех платформах (не только в Windows),
  • Roslyn - открытый компилятор,
  • вы можете использовать свой любимый редактор, а не только Visual Studio и
  • все с открытым исходным кодом.

В: Насколько сложно было стать более открытым?
О: Поначалу это было сложно и происходило в большей степени на командном уровне. Теперь он соответствует общему видению Microsoft и тому, как продукты взаимодействуют друг с другом (например, Azure).

Эволюция C # - это балансирующее действие, как вы хотите

  • агрессивно улучшать, а также оставаться простым,
  • улучшить существующие разработки и стать привлекательными для большего числа пользователей,
  • примите новые парадигмы, но оставайтесь верными духу C #.

Новые возможности C # 7.0

Мэдс начал с незначительных особенностей и кратко рассказал о новых двоичных литералах. И разделитель _.

int[] x = [0b1, 0b10, 0b100, 0b1_000];
int y = 1_000_000;

Вопрос: Как C # 7.0 соотносится с CLR? Нужна ли обновленная среда выполнения?
A: Вы можете настроить таргетинг на CLR 2.0 - новые функции не реализованы с новыми инструкциями IL.

Кортежи

Одна из основных функций - прямая поддержка кортежей - System.ValueTuple. Итак, теперь вы можете писать функции с несколькими возвращаемыми значениями.

private static (int, int) Tally(int[] numbers)

Q: Чем System.ValueTuple отличается от System.Tuple?
A: Это структура, а не класс System.Tuple. И у него всего 7 полей, а остальное становится кортежем (например, Item8 - это кортеж).

Q: Почему это класс System.Tuple?
A: Это было дизайнерское решение команды F #, но они тоже могут пожалеть об этом.

Кроме того, вы можете писать литералы кортежей, например (0, 0);

Q: Это ограничено только типами значений?
A: Нет, они являются общими типами ниже.

Вы можете дополнительно указать имена для элементов кортежа в определениях методов, литералах и везде, где вы используете кортежи.

public static (int sum, int count) …
var x = (sum: 0, count: 0);

Эти имена отслеживаются только компилятором; во время выполнения они не используются, и виден только стиль Item1. При отладке имена доступны, но не при использовании отражения.

Еще одна особенность - деконструкция кортежей с обозначением _ для неиспользуемых переменных - discards.

(int sum, _ ) = Tally(numbers);

Деконструкция также может использоваться с вашими собственными типами, переопределяющими деконструктор.

Кортежи являются изменяемыми, но не рекомендуется изменять их - элементы являются общедоступными полями, что смягчает все недостатки. Вы получаете равенство, вычисление хэш-кода и все преимущества использования структур из коробки.

Локальные функции

Помимо кортежей вы можете писать локальные функции - функцию внутри функции. Это может улучшить читаемость вашего кода, сохраняя его закрытым и аккуратным.

private void MyFunction()
{
    Add(0, 1);
    void Add(int s, int c => r = (….);
}

В: Можете ли вы передать локальную функцию в качестве делегата лямбда другой функции?
О: Да, можете.

Сопоставление с образцом

Наконец, C # получает сопоставление с образцом с несколько неудобным синтаксисом.

switch (v)
{
  case int i:
    Add(i);
    break;
  case object[] a when a.length > 0:
    ...
}

В: Есть ли план по улучшению синтаксиса соответствия?
О: Да, он стоит на повестке дня.

Обратите внимание, что вы можете использовать любые выражения условия, и он способен извлекать значение, соответствующее «локальной» переменной. С этой функцией переключатель теперь чувствителен к регистру.

Q: Это критическое изменение?
A: Нет, потому что в предыдущих выражениях switch использовались константы, которые не заботились о порядке.

Другие

И с этим еще несколько мелких функций. Вы можете объявить переменную в середине выражения.

int.TryParse(…, out var x) { x += 1; }

И вы можете делать возврат ссылок и местных жителей. Это полезно для низкоуровневой разработки, когда вы не хотите выделять объекты и хотите избежать сборки мусора.

Будущее

Новые версии C # планируется выпускать ежеквартально, что звучит довольно смело. Следующие предложения являются лишь набросками и могут быть изменены в будущем.

C# 7.1

Это должен быть выпуск небольших удобных функций, которые на самом деле не связаны друг с другом, являются небольшими и самодостаточными.

Возможность определять асинхронную главную функцию, даже если это в основном для демонстрационных целей.

И явно укажите инициализацию по умолчанию с помощью

int i = default

усилить нулевой вывод

int? n = b ? i : null

добавить инициализаторы проекции кортежа

var t = (i, n); return t.i;

и добавляйте сбросы в другие места

o.PropertyChanged(_, _) => …

C# 7.2

Этот выпуск будет сосредоточен на более низкоуровневых вещах без необходимости работать с указателями. Многие разработчики игр используют C # с Unity, и более высокая производительность также может быть использована в финансовых и других приложениях.

Эти функции могут включать в себя параметры ref readonly и возвращаемые значения (противоположность параметру out, который необходимо назначить) - он говорит, что меня не изменяют.

Методы расширения не идеальны, поэтому измените их дизайн и разрешите использовать их с ссылками и структурами.

И разрешить условные реф.

Другая функция может включать в себя структуры, доступные только для чтения, которые не нужно копировать, и новые структуры, подобные ссылкам, для абстракции по куску памяти.

C# 7.3

Эта версия должна быть ориентирована на более приятные шаблоны и удобство для разработчиков. Это может включать в себя более совершенные рекурсивные шаблоны, лучший синтаксис для сопоставления с образцом и шаблоны кортежей.

C# 8.0

Основной выпуск, в котором команда C # может внести изменения в CLR - это будет впервые с момента появления дженериков. Все функции, добавленные с тех пор, были в основном уловками компилятора.

Одна из предлагаемых функций - ссылочные типы, допускающие значение NULL.

string? n; // nullable — enforces checking before usage
string s; // non-nullable
n = null; // sure
s = null; // warning
s = n; // warning
s.Length(); // sure
n.Length(); // warning
if (n != null) { n.length } // sure
n!.length // sure – a new operator converts into non-nullable

Важной особенностью может быть добавление реализации по умолчанию для членов интерфейса. Один из вариантов использования - сделать C # отличным инструментом для работы с мобильными платформами (и Java, и Objective-C поддерживают эту функцию) и сделать Xamarin еще более крутым.

И, наконец, несколько улучшений, связанных с асинхронностью с асинхронными потоками и одноразовыми объектами, и добавление foreach await для обработки данных при поступлении и использовании await для безопасного применения одноразового шаблона.

C # может добавлять записи (аналогичные Ruby OpenStruct) для простых классов с реализацией деконструкции, хэш-кодами и равенством по умолчанию.

class Person(string name, string lastName);

Наконец, может быть поддержка неизменяемых объектов.

Заключение

Итак, это все. Будущее C # довольно светлое, а функции - захватывающие. Я очень доволен введением и деконструкцией сопоставления с образцом. И, возможно, в будущем неизменяемые объекты с некоторыми ссылочными типами, допускающими значение NULL. Было бы здорово.

Опять же, большой привет WelliDotNet не только за пиццу, но и за грандиозное мероприятие со спикером мирового класса.

Если вам понравилась эта статья, возможно, вам понравится информационный бюллетень C # Digest с 5 ссылками от сообщества .NET, который я собираю каждую неделю.