Встречайте C# 7.0: масштабное обновление языка программирования от Microsoft

Согласно рейтингу 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