Согласно рейтингу TIOBE C# занимает четвертую строчку в списке самых популярных языков программирования, а в рейтинге Redmonk, о котором мы писали ранее — пятую. Область его применения обширна: начиная с написания приложений под Windows и заканчивая созданием мобильных приложений. И обновление языка такого уровня — это всегда большое событие.
Начнем с малого. Раньше мы могли использовать числовые литералы, десятичные и шестнадцатеричные числа :
int[] numbers =
{ 1, 2, 4, 8, 16, 32 };
Теперь нам стали доступны двоичные числа. Вот как это выглядит:
int[] numbers =
{ 0b1, 0b10, 0b100, 0b1000, 0b10000, 0b100000};
Числа, особенно в двоичной системе счисления, могут стать очень большими, и их просто не удобно будет читать. Поэтому была добавлена возможность разделения разрядов в числах:
int[] numbers =
{ 0b1, 0b10, 0b100, 0b1000, 0b1_0000, 0b10_0000, 6_4};
Кортежи
Кортежи — одна из главных фич C# 7.0. Например, мы хотим написать функцию, которая будет считать сумму и количество данных ей чисел.
var t = Tally(numbers); // Tally - имя функции
Но мы хотим, чтобы функция возвращала два значения. Это можно реализовать, используя кортежи. Сделаем это тремя способами:
WriteLine($"Sum: {t.sum}, count: {t.count}"); // первый способ объявления кортежа
var (sum, count) = Tally(numbers); // второй способ
(int, int) Tally(int[] values){ // третий способ
var r = (s:0,c:0); // создаем кортеж из двух значений
foreach (var v in values) // проходимся по каждому данному числу
{
r = (r.s + v,r.c + 1); // увеличиваем сумму (r.s) и количество (r.c)
// второй способ:
r.s += v; r.c++;
}
return r;
};
Локальные функции
Пускай мы хотим увеличивать значение r напрямую, используя функцию Add. Теперь это можно сделать, объявив Add внутри нашей функции, тогда Add будет называться локальной функцией.
(int sum, int count) Tally(int[] values)
{
var r = (s:0, c:0);
foreach (var v in values)
{
Add(v,1);
}
return r;
void Add(int s, int c) { r.s += s; r.c += c;}
}
Сопоставление с образцом
Паттерны — новые конструкции в C#, используемые для тестирования значений. Один из способов использования паттернов — использование их в is-выражениях.
public void PrintStars(object o)
{
if (o is null) return; // постоянный паттерн "null". Данное выражение
// проверяет является ли o "null"
if (!(o is int i)) return; // паттерн-тип "int i". Он проверяет, что o
WriteLine(new string('*', i)); // это int, если условие выполняется, то i
// становится o
}
Паттерны также могут быть использованы в switch-выражениях:
switch (shape)
{
case Rectangle s when (s.Length == s.Height): // условие "when"
WriteLine($"{s.Length} x {s.Height} square");
break;
case Rectangle r:
WriteLine($"{r.Length} x {r.Height} rectangle");
break;
case Circle c: // тип-паттерн
WriteLine($"circle with radius {c.Radius}"); // использует c
break;
case null:
throw new ArgumentNullException(nameof(shape));
default:
WriteLine("<unknown shape>");
break;
}
С остальными нововведениями можно ознакомиться по ссылке.
Источник: Channel 9