Возможности C # 7


Пока вы все еще пытаетесь разобраться в новых функциях C # 6, команда начинает думать о том, что должно быть в C # 7.

Ах да, я помню C #, когда это был небольшой компактный язык. С тех пор он сделал то, что делает большинство языков, — добавил функции. Сейчас это многопарадигмальный язык программирования, и он все еще находится в стадии разработки!

Мадс Торгерсен, менеджер программы для языка C #, только что опубликовал список возможных идей для включения в следующую версию. Ни одно из предложений не является твердым, и он старается не вызывать у вас надежд на то, что какое-то конкретное предложение попадет в список, но они относятся к категории «Сильный интерес»; Некоторый интерес; Маленький, но полезный; Интересно, но требуется поддержка CLR; Наверное, не в этот раз; Наверное, ни разу и не «расстегнутый».
Вы можете увидеть полный список в его сообщении на GitHub, но стоит просто получить представление о категории «Сильный интерес» (объяснения принадлежат мне, а не Торгерсену).
Кортежи
Такие языки, как Python, поддерживают кортежи, и самая большая проблема обычно заключается в том, чтобы объяснить новичкам, почему в нем вообще есть кортежи. Однако в C # нет нетипизированного списка, поэтому проще обосновать кортеж. По сути, кортеж — это группа типизированных значений, которые собираются вместе для некоторой временной цели. Например, представьте себе набор параметров метода как входной кортеж. Идея состоит в том, что мы можем расширить синтаксис, чтобы кортежи можно было использовать для выходных данных метода.
Например:
public (int sum, int count) myMethod (parameters) {… return (s, c); }
и
var t = myMethod (); Console.Write (t.sum, t.count);
Вы можете видеть, что кортеж можно рассматривать как анонимную структуру, и именно так она будет реализована.
Примечание. В C # уже есть набор общих классов кортежей, но они ограничены сравнением.
Сопоставление с образцом и алгебраические типы
Еще одна функциональная идея, предлагаемая для C #, — сопоставление с образцом. Это позволяет использовать более простые и мощные условные выражения в зависимости от типа выражения. Например, вместо того, чтобы писать:
var v = x as int; if (v! = null) {код, который использует v как int};
как
if (x is int v) {код, который использует v как int};
Это кажется небольшим изменением, но пример int — это только начало ряда сложных шаблонов, которые вы можете указать. В свитче обычно используются паттерны:
switch (e) {case type: action; …}
Однако эта возможность писать условные выражения, включающие тип, действительно полезна только в том случае, если у вас есть более продвинутая форма типа — алгебраический или параметрический тип. Таким образом, наряду с сопоставлением с образцом мы должны ввести в C # алгебраический тип, который, по крайней мере, изначально называется типом записи. Тип записи может рассматриваться как определение класса, которое включает параметры. Например:
публичный рекорд класса Point (двойной X, двойной Y)
определяет тип с двумя двойными свойствами. Вы можете увидеть, как это можно скомпилировать в стандартный класс. Однако вы также получаете новый тип Point (double, double), который можно использовать при сопоставлении с образцом.
Чтобы дать вам некоторое представление о том, насколько все это мощно, просто взгляните на пример, приведенный в предложении. Сначала мы определяем некоторые типы, подходящие для представления символьного полиномиального выражения в X:
абстрактный класс Expr; class X (): Expr; class Const (двойное значение): Expr; class Add (Expr Left, Expr Right): Expr; class Mult (Expr Left, Expr Right): Expr; class Neg (Expr Value): Expr;
Используя сопоставление с образцом, теперь мы можем написать рекурсивную функцию, которая находит производную выражения:
Expr Deriv (Expr e) {
switch (e) {
case X (): return Const (1); case Const (*): return Const (0);
case Add (var Left, var Right):
return Add (Deriv (слева), Deriv (справа));
case Mult (var Left, var Right):
return Add (Mult (Deriv (слева), Right), Mult (Left, Deriv (Right)));
case Neg (значение var):
return Neg (Deriv (Value)); }
}
Ссылки, не допускающие значения NULL
Это гораздо меньшее предложение, чем шаблоны и записи, и оно включает только способ, которым компилятор проверяет код, а не сгенерированный IL.
Если вы используете такой тип, как Cat, ничего не изменится, но если вы поставите! после этого Кот! тогда он не может быть нулевым, это обязательная ссылка. Это означает, что компилятор будет отмечать любую попытку установить ссылку на null:
Кошка! cat = null;
выдает ошибку времени компиляции. Компилятор также позволяет использовать обязательные ссылки без проверки на null.
Ссылка, допускающая значение NULL, обозначается знаком?, Однако всегда должна проверяться перед использованием. Например:
Кошка? cat = null;
хорошо, но если вы сейчас напишите
cat.meow ();
вы увидите ошибку времени компиляции. Единственный способ использовать ссылку, допускающую значение NULL, — это проверить ее перед использованием:
check (cat) {cat.meow ();} else {cat is null}
Вы можете проверять наличие null всеми способами, и часть проблемы состоит в том, чтобы убедиться, что компилятор проверяет достаточно тонких способов проверки или отсутствия проверки, чтобы быть полезными.
Конечно, если не использовать! или же ? вы можете делать все, что хотите, со ссылкой.
Использование операторов и async / await
Оператор using — это способ убедиться, что объекты удаляются, как только они выходят за пределы области видимости. Новое предложение состоит в том, чтобы просто распространить это на асинхронные методы.
Итак, на данный момент вы можете писать такие вещи, как:
using (MyClass myClass = new MyClass ()) {сделайте что-нибудь с myClass}
и вы можете быть уверены, что myClass удаляется в конце блока. Предложение состоит в том, чтобы разрешить использование внутри асинхронного метода для автоматического и асинхронного удаления ресурсов.
В категории «Некоторый интерес» есть несколько интересных идей, но есть 18 различных предложений, для объяснения каждого из которых потребуется много слов. Два, которые я бы предпочел, — это списки и словари основного языка.
С другой стороны, некоторые из «маленьких, но полезных» могут сделать это на том основании, что они относительно просты:

Разрешить методы расширения в нестатических классах
Больше улучшений (общие ограничения, статика и экземпляр)
параметры
IEnumerable
Двоичные литералы
Разделители цифр

В целом, я считаю, что лучше оставить C # в покое и добавить только те функции, которые так явно необходимы, чтобы они попадали в категорию «Must have». Позволить C # продвинуться дальше к функциональному программированию может показаться привлекательным, но почему тогда у нас есть F #?

Больше информации
Рабочий список функций C # 7
Статьи по Теме
C # 7 — Что бы вы вставили?
Выпущена Visual Studio 2015 CTP 5
Массовый переход Microsoft на GitHub
.NET Core Подробности — достаточно ли?
Последние версии на C # 6 и VB 12
Возможности C # 6.0
В C # появился новый оператор — безопасная навигация
RyuJIT — компилятор JIT .NET нового поколения
Microsoft советует разработчикам C # изучать JavaScript !?
Команда Microsoft объясняет языковую стагнацию

Чтобы получать информацию о новых статьях на I Programmer, установите панель инструментов I Programmer, подпишитесь на RSS-канал, подпишитесь на нас в Twitter, Facebook, Google+ или Linkedin или подпишитесь на нашу еженедельную новостную рассылку.

Комментарии
Оставьте комментарий или просмотрите существующие комментарии с помощью Disqus
или отправьте свой комментарий по адресу: comments@i-programmer.info


Добавить комментарий