Язык 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.