heap.tech
лаборатория велосипедов
×

Новое в C# 7

12 апреля 2016
Неделю назад, если точнее, то первого апреля с 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 возвращает список доступных типов ? Вобщем больше ответов, чем вопросов. Но всеже, выглядит круто!

Посмотреть оригинал презентации можно на тытрубе. Клац.

Вторая часть статьи, полгода спустя
 
1899
0

Оставлять комментарии могут только зарегистрированные пользователи

пока никто не оставлял комментариев