
Неделю назад, если точнее, то
первого апреля с 30 по 31 марта сего года, состоялась презентация новых фишек компилятора c# и самой студии. Презентация прошла весело и без факапов. Во многом благодаря отличным ведущим (Torgersen и Campbell).
Количественный и качественный объем нововведений меня очень обрадовал, язык активно развивается, впитывая в себя крутые фичи. Более того, разработчики майрософт прислушиваются к dev-комьюнити и запиливают наиболее востребованные штуки. И, похоже, что с этим они отлично справляются, так держать!
Итак, светлое будущее уже здесь!
1 Локальные функции.
Теперь можно писать
портянку идеальный код как в JavaScript. Например в javascript можно так:
function foo() {
function localFunction(i) {
console.log('local function, the number value is: ' + i);
};
var my_value = 88;
localFunction(my_value);
}
Теперь тоже самое можно и в c#:
public void foo()
{
void localFunction()
{
Console.WriteLine("local function, the number value is: " + i);
}
localFunction();
}
Идея отличная. Хотя она может испортить понимание кода. Но все-таки, штука полезная, иногда может резко сократить и упростить код, но пользоваться надо с умом.
2 Кортежи (или tuples)
Напомню, что кортежи уже реализованы в C# 6.0. Но в 7 версии добавили синтаксический сахар, сделав их использование более наглядным и простым.
С помощью кортежей можно возвращать несколько типов из одного метода. Вернуть кортеж гораздо удобнее, чем создавать новый объект, использовать KeyValuePair , массив или крутить с ref \ out. Пример C# 7:
static (int, int, string, string) Foo(int one, int power)
{
var sqrt = one * one;
var nrt_variable = (int)Math.Pow(one, power);
var sqrt_descr = "SQRT - возведение числа во вторую степень";
var nrtvar_descr = "Math.Pow - возводит число x в степень y";
return (sqrt, nrt_variable, sqrt_descr, nrtvar_descr);
}
Короче, нагляднее и еще нагляднее и короче.
Но это еще не все – можно назначать и обращаться переменным кортежа по именам.
static (int sq, int nrt, string sq_d, string nrt_d) Foo(int one, int power)
{
var sqrt = one * one;
var nrt_variable = (int)Math.Pow(one, power);
var sqrt_descr = "SQRT - возведение числа во вторую степень";
var nrtvar_descr = "Math.Pow - возводит число x в степень y";
return (sqrt, nrt_variable, sqrt_descr, nrtvar_descr);
}
var x = Foo(2, 16);
Console.WriteLine(x.sq);
Console.WriteLine(x.sq_d);
Console.WriteLine(x.nrt);
Console.WriteLine(x.nrt_d);
А это то, как это сейчас (C# 6):
static Tuple<int, int, string, string> Foo(int one, int power)
{
var sqrt = one * one;
var nrt_variable = (int)Math.Pow(one, power);
var sqrt_descr = "SQRT - возведение числа во вторую степень";
var nrtvar_descr = "Math.Pow - возводит число x в степень y";
return Tuple.Create<int, int, string, string>(sqrt, nrt_variable, sqrt_descr, nrtvar_descr);
}
3 Двоичные литералы
В c#, кажется, начиная уже с первой версии, была возможность записывать шестнадцатеричные представления чисел. Вот так:
var hex = 0xFF; //int32, 255
Теперь аналогичным образом можно записывать и в двоичной системе:
var bin = 0b00000000000000000000000011111111; //int32, 255
Для наглядности биты можно отделять нижними подчеркиваниями:
var bin = 0b00000000_00000000_0000000_11111111; //int32, 255
4 Создание immutable-объектов
var regular = new MyClass { Field1 = 1, Field2 = "один" };
var immutable = regular with { Field1 = 0 };
Ключевое слово
with запрещает изменение объекта immutable, у которого свое место в стеке, отличное от объекта regular.
5 Pattern matching
Сравнение типа переменной с образцом.
object wrappedInt = 31337;
if (wrappedInt is int plainInt)
{
Console.WriteLine("wrappedInt has int type and it was converted to int: " + plainInt);
}
В итоге, если условие верное, будет объявлена новая переменная plainInt. Значение которой будет 31337. Удобно, не нужно морочиться с typeof \ GetType
6 Pattern matching и switch
В блоках case можно вводить дополнительные условия. Да-да, условия:
object[] array = { 1, 2, 3, 4, new object[] { -1, -2, -3, -4 }, 5 };
foreach(var i in array)
{
switch(i)
{
case int i32:
Console.WriteLine("i is typeof int:" + i32);
break;
case IEnumerable<object> n when n.Any():
Console.WriteLine("i is typeof array:" + n);
break;
}
}
Вроде-бы круто, но! Но все как-то смутновато. Из презентации не понятно, что есть такое n.Any. Что возвращает метод Any, тип ? Если да, то зачем вводить в условии IEnumerable<object> ? Или Any возвращает список доступных типов ? Вобщем больше ответов, чем вопросов. Но всеже, выглядит круто!
Посмотреть оригинал презентации можно на тытрубе.
Клац.
Вторая часть статьи, полгода спустя