Согласно рейтингу TIOBE C# занимает четвертую строчку в списке самых популярных языков программирования, а в рейтинге Redmonk, о котором мы писали ранее — пятую. Область его применения обширна: начиная с написания приложений под Windows и заканчивая созданием мобильных приложений. И обновление языка такого уровня — это всегда большое событие.
Начнем с малого. Раньше мы могли использовать числовые литералы, десятичные и шестнадцатеричные числа :
|
1
2
|
int[]numbers=
{1,2,4,8,16,32};
|
Теперь нам стали доступны двоичные числа. Вот как это выглядит:
|
1
2
|
int[]numbers=
{0b1,0b10,0b100,0b1000,0b10000,0b100000};
|
Числа, особенно в двоичной системе счисления, могут стать очень большими, и их просто не удобно будет читать. Поэтому была добавлена возможность разделения разрядов в числах:
|
1
2
|
int[]numbers=
{0b1,0b10,0b100,0b1000,0b1_0000,0b10_0000,6_4};
|
Кортежи
Кортежи — одна из главных фич C# 7.0. Например, мы хотим написать функцию, которая будет считать сумму и количество данных ей чисел.
|
1
|
vart=Tally(numbers);// Tally - имя функции
|
Но мы хотим, чтобы функция возвращала два значения. Это можно реализовать, используя кортежи. Сделаем это тремя способами:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
WriteLine($"Sum: {t.sum}, count: {t.count}");// первый способ объявления кортежа
var(sum,count)=Tally(numbers);// второй способ
(int,int)Tally(int[]values){// третий способ
varr=(s:0,c:0);// создаем кортеж из двух значений
foreach(varvinvalues)// проходимся по каждому данному числу
{
r =(r.s+v,r.c+1);// увеличиваем сумму (r.s) и количество (r.c)
// второй способ:
r.s+=v;r.c++;
}
returnr;
};
|
Локальные функции
Пускай мы хотим увеличивать значение r напрямую, используя функцию Add. Теперь это можно сделать, объявив Add внутри нашей функции, тогда Add будет называться локальной функцией.
|
1
2
3
4
5
6
7
8
9
10
|
(intsum,intcount)Tally(int[]values)
{
varr=(s:0,c:0);
foreach(varvinvalues)
{
Add(v,1);
}
returnr;
voidAdd(ints,intc){r.s+=s;r.c+=c;}
}
|
Сопоставление с образцом
Паттерны — новые конструкции в C#, используемые для тестирования значений. Один из способов использования паттернов — использование их в is-выражениях.
|
1
2
3
4
5
6
7
8
9
|
publicvoidPrintStars(objecto)
{
if(oisnull)return;// постоянный паттерн "null". Данное выражение
// проверяет является ли o "null"
if(!(oisinti))return;// паттерн-тип "int i". Он проверяет, что o
WriteLine(newstring('*',i));// это int, если условие выполняется, то i
// становится o
}
|
Паттерны также могут быть использованы в switch-выражениях:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
switch(shape)
{
caseRectangleswhen(s.Length==s.Height): // условие "when"
WriteLine($"{s.Length} x {s.Height} square");
break;
caseRectangler:
WriteLine($"{r.Length} x {r.Height} rectangle");
break;
caseCirclec:// тип-паттерн
WriteLine($"circle with radius {c.Radius}");// использует c
break;
casenull:
thrownewArgumentNullException(nameof(shape));
default:
WriteLine("<unknown shape>");
break;
}
|
С остальными нововведениями можно ознакомиться по ссылке.
Источник: https://tproger.ru/news/sharp-seven/
