Язык 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.
Комментарии