Язык C# и .NET: путь продолжающего в 2019 году

Язык C# не стоит на месте и обновляется корпорацией Microsoft. Вот интересные обновления, представленные в восьмой версии языка.

Хорошо знаете C#? Тогда смело вносите себя в список продолжающих ;)

Что сейчас происходит? В Preview 2 появились улучшения pattern matching, using-объявления, статические локальные функции и одноразовые ref структуры.

В Preview 1 были представлены фиктивные ссылочные типы, асинхронные потоки, а также индексы и диапазоны.

Как работает pattern matching в C#?

Улучшение даёт инструменты для предоставления формозависимой функциональности между похожими, но различающимися видами данных. В C# 7.0 синтаксис для шаблонов типов и констант был доступен выражением is с оператором switch. Но это только первые шаги к поддержке парадигм программирования с разделёнными функциональностью и данными.

По мере движения индустрии к микросервисам и облачным инфраструктурам возникает необходимость в других инструментах.

C# 8.0 расширяет словарь так, что можно использовать выражения шаблонов в разных местах кода. Применяйте эту фичу, когда данные и функциональность разделены. Используйте pattern matching, когда ваш алгоритм не зависит от типа среды выполнения объекта. Эти методы предоставляют другой способ выразить дизайн.

Плюс в язык C# 8.0 добавлены рекурсивные шаблоны. Результат любого выражения шаблона – выражение. Рекурсивный шаблон – это просто выражение шаблона, применённое на выходе другого выражения шаблона.

А что там со switch?

Часто выражение switch производит значение, указанное в одном из блоков case. Выражения switch позволяют использовать более краткий синтаксис. В них меньше повторяющихся case и break, и меньше фигурных скобок. Посмотрите на следующее перечисление с цветами радуги:

public enum Rainbow
{
    Red,
    Orange,
    Yellow,
    Green,
    Blue,
    Indigo,
    Violet
}

А теперь укажем тип RGBColor, который построен из компонентов R, G и B. С помощью следующего метода можно конвертировать значение Rainbow в значения RGB:

public static RGBColor FromRainbow(Rainbow colorBand) =>
    colorBand switch
    {
        Rainbow.Red    => new RGBColor(0xFF, 0x00, 0x00),
        Rainbow.Orange => new RGBColor(0xFF, 0x7F, 0x00),
        Rainbow.Yellow => new RGBColor(0xFF, 0xFF, 0x00),
        Rainbow.Green  => new RGBColor(0x00, 0xFF, 0x00),
        Rainbow.Blue   => new RGBColor(0x00, 0x00, 0xFF),
        Rainbow.Indigo => new RGBColor(0x4B, 0x00, 0x82),
        Rainbow.Violet => new RGBColor(0x94, 0x00, 0xD3),
        _              => throw new ArgumentException(message: "invalid enum value", paramName: nameof(colorBand)),
    };

Здесь есть несколько улучшений синтаксиса:

  • Переменная появляется перед switch. Различный порядок помогает визуально различить выражение switch от условия.
  • Элементы case и : заменены на =>, что более кратко и интуитивно.
  • Случай default заменён на _ отказ.
  • Тела – это выражения, не условия.

Сравните с эквивалентным кодом с использованием классического условия switch:

public static RGBColor FromRainbowClassic(Rainbow colorBand)
{
    switch (colorBand)
    {
        case Rainbow.Red:
            return new RGBColor(0xFF, 0x00, 0x00);
        case Rainbow.Orange:
            return new RGBColor(0xFF, 0x7F, 0x00);
        case Rainbow.Yellow:
            return new RGBColor(0xFF, 0xFF, 0x00);
        case Rainbow.Green:
            return new RGBColor(0x00, 0xFF, 0x00);
        case Rainbow.Blue:
            return new RGBColor(0x00, 0x00, 0xFF);
        case Rainbow.Indigo:
            return new RGBColor(0x4B, 0x00, 0x82);
        case Rainbow.Violet:
            return new RGBColor(0x94, 0x00, 0xD3);
        default:
            throw new ArgumentException(message: "invalid enum value", paramName: nameof(colorBand));
    };
}

В документации больше примеров:

using-объявления

Это способ объявления переменных с помощью ключевого слова using. Оно указывает компилятору, что метод Disposе() для объявляемой переменной будет вызван в конце области видимости. Посмотрите на пример записи файла:

static void WriteLinesToFile(IEnumerable<string> lines)
{
    using var file = new System.IO.StreamWriter("WriteLines2.txt");
    foreach (string line in lines)
    {
        // Если строка не содержит слова 'Second', записать строку в файл.
        if (!line.Contains("Second"))
        {
            file.WriteLine(line);
        }
    }
// файл освобождается здесь
}

В этом примере вызов происходит по достижении закрывающей скобки метода, то есть в конце области видимости, где объявлен file. А вот эквивалентен с использованием классического оператор using:

static void WriteLinesToFile(IEnumerable<string> lines)
{
    using (var file = new System.IO.StreamWriter("WriteLines2.txt"))
    {
        foreach (string line in lines)
        {
            // Если строка не слдержит слово 'Second', записать строку в файл.
            if (!line.Contains("Second"))
            {
                file.WriteLine(line);
            }
        }
    } // файл освобождается здесь
}

Видите? Здесь Dispose() вызывается по достижении закрывающей скобки для using. В обоих случаях компилятор вызывает Dispose().

Статические локальные функции

Теперь можно добавлять модификатор static к локальным функциям, чтобы убедиться, что они не захватывают переменные из области видимости.

Дальше локальная функция LocalFunction получает доступ к переменной y, объявленной в области видимости. Так что LocalFunction не может быть объявлена с модификатором static:

int M()
{
    int y;
    LocalFunction();
    return y;

    void LocalFunction() => y = 0;
}

Следующий код содержит статическую локальную функцию. Это возможно потому, что она не имеет доступа к переменным в области видимости:

int M()
{
    int y = 5;
    int x = 7;
    return Add(x, y);

    static int Add(int left, int right) => left + right;
}

Ранее были анонсированы обновления в C# 8.0 Preivew 1, которые доступны в официальной документации:

Полезные инструменты

.NET Core – это модульная платформа для разработки программного обеспечения, с открытым исходным кодом. Она была официально выпущена 27 июня 2016 года. На основе .NET Core был создан ASP.NET Core – платформа разработки веб-приложений.

Обе платформы поддерживают язык C# и являются обновлениями предшествующих .NET Framework и ASP соответственно.

Разрабатываете веб-приложения? Читайте документацию APS.NET на русском.

238 samples for ASP.NET Core 2.1, 2.2

Цель этого проекта – дать возможность программистам .NET изучить новый стек ASP.NET Core с нуля с помощью кода. Репозиторий обновляется ежедневно и содержит примеры использования ASP.NET Core 3.0!

.NET Diagnostics Tools

Этот репозиторий содержит инструменты для диагностики .NET приложений. Вот некоторые:

  • dotnet-dump – кроссплатформенная утилита для сбора дампов памяти процессов .NET.
  • dotnet-collect – кроссплатформенный инструмент для сбора данных из Managed EventSources и событий .NET Runtime с помощью EventPipe.

Язык C# и .NET: свежие книги

Гораздо легче осваивать обновления любимого языка с помощью книг. Так и с C#. Книги скачать или купить можно по приведенным ниже ссылкам:

  • C# in Depth 4th Edition, 2019 – книга от Senior Software Engineer из Google. Гайд для освоения последних нововведений в язык программирования C#. В ней рассматриваются асинхронные функции, тело-выражения, интерполированные строки, кортежи и не только.
  • Программирование на C# для начинающих. Основные сведения, 2018 – это руководство посвящено начинающим разработчикам. Оно познакомит вас с синтаксисом языка, основными операторами и функциями по работе с числами, строками и массивами, а также с основами объектно-ориентированного программирования.
  • C# 7.1 and .NET Core 2.0: Modern Cross-Platform Development – в этом руководстве вы познакомитесь с основами работы C# 7.1 и платформы .NET Core 2.0.
  • C# на примерах, 2018 – освойте язык C#, рассматривая и решая примеры, сложность которых растёт от главы к главе. Сначала вы напишете простую программу по вводу и выводу данных, а потом перейдёте к ключевым возможностям C#: многопоточность, ООП, создание клиент-серверных приложений и разработка программ для мобильных устройств.

Веб-разработка с ASP.NET Core MVC

ASP.NET MVC – это многофункциональная платформа для создания веб-приложений и API-интерфейсов с помощью структуры проектирования Model-View-Controller.

Структура архитектуры MVC предполагает разделение приложения на три основные группы компонентов:

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

Как это работает? Запросы пользователей направляются в контроллер, который отвечает за работу с моделью для выполнения действий пользователей и получение результатов запросов. Контроллер выбирает представление для отображения пользователю с данными модели.

Распределение обязанностей позволяет масштабировать приложение в контексте сложности. Так проще писать код, выполнять отладку и тестирование компонента (модели, представления или контроллера) с одним заданием. Гораздо труднее обновлять, тестировать и отлаживать код, зависимости которого находятся в двух или трёх этих областях.

Например, логика пользовательского интерфейса, как правило, подвергается изменениям чаще, чем бизнес-логика. Если код представления и бизнес-логика объединены в один объект, содержащий бизнес-логику, объект необходимо изменять при каждом обновлении UI. Это часто приводит к ошибкам и тестированию бизнес-логики после каждого незначительного изменения пользовательского интерфейса.

Начните изучение MVC и ASP.NET для веб-разработки с официальной русскоязычной документации от Microsoft.

А что вы ждете от C# 8.0? Пишите в комментариях :)

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

matyushkin
18 марта 2020

ТОП-10 книг по C#: от новичка до профессионала

Отобрали актуальные книги по C#, .NET, Unity c лучшими оценками. Расположил...
Библиотека программиста
25 августа 2019

Почему C# программисты скоро будут нарасхват

C# программисты становятся более востребованными благодаря развивающейся эк...
Библиотека программиста
12 марта 2018

Видеокурс по C# с нуля: от основ до полноценного приложения

Подробный видеокурс для изучающих C# с нуля. Пройдем путь от основ до напис...