10 полезных фич в C# | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Backend-разработчик на PHP Алгоритмы и структуры данных Team Lead Архитектура и шаблоны проектирования Разработчик IoT C# Developer. Professional HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Symfony Framework Unity Game Developer. Basic JavaScript Developer. Professional Android Developer. Basic JavaScript Developer. Basic Java Developer. Professional Highload Architect Reverse-Engineering. Professional Java Developer. Basic Web-разработчик на Python Framework Laravel Cloud Solution Architecture Vue.js разработчик Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool" PHP Developer. Basic
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK Administrator Linux. Professional Дизайн сетей ЦОД Разработчик IoT PostgreSQL Экспресс-курс "Версионирование и командная работа с помощью Git"
-30%
Microservice Architecture Highload Architect MS SQL Server Developer Разработчик программных роботов (RPA) на базе UiPath и PIX Разработчик голосовых ассистентов и чат-ботов Administrator Linux. Advanced Infrastructure as a code Супер-практикум по использованию и настройке GIT Administrator Linux.Basic Экспресс-курс «IaC Ansible» Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» Основы Windows Server
Корпоративные курсы
Безопасность веб-приложений IT-Recruiter Дизайн сетей ЦОД Компьютерное зрение Разработчик IoT Вебинар CERTIPORT Machine Learning. Professional
-6%
NoSQL Пентест. Практика тестирования на проникновение Java QA Engineer. Базовый курс Руководитель поддержки пользователей в IT
-8%
SRE практики и инструменты Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Infrastructure as a code Супер-практикум по использованию и настройке GIT Промышленный ML на больших данных Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» BPMN: Моделирование бизнес-процессов Основы Windows Server
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

10 полезных фич в C#

CSharp_Deep_3.10-5020-ac1ae9.png

Знание этих приёмов позволит вам избежать многих ошибок. Вы не только станете писать более понятный код, но и сэкономите своё время.

1. async/await

Паттерны async/await позволят разблокировать UI/текущий поток при выполнении блочных операторов. Также они позволят вашему коду работать даже в том случае, если что-то будет блокировать его выполнение (к примеру, web-запрос).

Подробности использования этих паттернов вы найдёте здесь.

2. Инициализаторы объектов/коллекций/массивов

Обратите внимание на следующий участок кода:

//Обычный демо-класс
public class Employee {
    public string Name {get; set;}
    public DateTime StartDate {get; set;}
}

//Создайте employlee, применяя инициализатор
Employee emp = new Employee {Name="John Smith", StartDate=DateTime.Now()};

Этот пример будет вам полезен в юнит-тестировании. В других случаях желательно применять конструкторы.

Подробности.

3. Лямбды, делегаты, предикаты и замыкания

Просто незаменимы во множестве ситуаций, к примеру, при использовании LINQ. Но вы должны понимать, как и когда их использовать.

Подробности.

4. ?? (оператор объединения с NULL)

x ?? y — возвращает x, когда значение отличается от null; в обратном случае возвращает y.

//Может быть null
var someValue = service.GetValue();
var defaultValue = 23

//result будет 23, если someValue - null
var result = someValue ?? defaultValue;

Операторов ?? может быть несколько:

string anybody = parm1 ?? localDefault ?? globalDefault;

Оператор ?? также подходит для перевода типов null в не null:

var totalPurchased = PurchaseQuantities.Sum(kvp => kvp.Value ?? 0);

Подробности.

5. $”{x}” (интерполяция строк) — C# 6

Данная фича в C# 6 позволит вам собирать строки элегантно и эффективно:

//Ранее
var someString = String.Format("Some data: {0}, some more data: {1}", someVariable, someOtherVariable);

//Сейчас
var someString = $"Some data: {someVariable}, some more data: {someOtherVariable}";

6. ?.(определяет null) — C# 6

x?.y — доступ к членам, который определяется условием null. Значение null возвращается, если левый операнд имеет значение null.

//Null, если customer, или customer.profile, или customer.profile.age — null
var currentAge = customer?.profile?.age;

А значит, больше никаких NullReferenceExceptions!

Подробности.

7. Выражение nameof — C# 6

Некоторые скажут, что выражение nameof не очень-то полезно, однако это не так. В случае применения автоматических инструментов рефакторинга (к примеру, ReSharper) нам может потребоваться обращение к аргументу метода по его имени:

public void PrintUserName(User currentUser)
{
    //Инструмент рефакторинга может пропустить текстовое обращение к текущему пользователю, если его переименовать
    if(currentUser == null)
        _logger.Error("Argument currentUser is not provided");

    //...
}

Вот, как это должно быть:

public void PrintUserName(User currentUser)
{
    //Инструмент рефакторинга уже ничего не пропустит
    if(currentUser == null)
        _logger.Error($"Argument {nameof(currentUser)} is not provided");

    //...
}

Подробности.

8. Инициализаторы свойств (property) — C# 6

Позволяют задавать для свойств начальные значения:

public class User
{ 
    public Guid Id { get; } = Guid.NewGuid();
    // ...
}

Их польза в том, что вы не сможете объявить setter, сделав тем самым свойства неизменяемыми. Кроме того, инициализаторы свойств прекрасно работают в связке с синтаксисом первичного конструктора в C# 6.

9. Операторы is и as

Is — совместимость типов. Оператор возвращает значение true, когда вычисленный левый операнд можно привести к типу, указанному в правом операнде (статический тип).

if (Person is Adult)
{
    //код
}

As — преобразование типов. Оператор возвращает левый операнд, который приведён к типу, заданному правым операндом (статический тип). Однако as возвращает null там, где (T)x вызывает исключение.

SomeType y = x as SomeType;
if (y != null)
{
    //код
}

10. Ключевое слово yield

Мы уже писали о ключевом слове yield. Оно обеспечивает заполнение интерфейса IEnumerable объектами (items). Давайте посмотрим на код, который вернёт все степени двойки от 2 до 2 в степени 8 (2, 4, 8, 16, 32, 128, 256):

public static IEnumerable Power(int number, int exponent)
{
    int result = 1;
    for (int i = 0; i < exponent; i++)
    {
      result = result * number;
      yield return result;
    }
}

Собственно говоря, в умелых руках yield — мощная штука. Вы сможете легко сгенерировать последовательность объектов, то есть системе не потребуется перечислять всю коллекцию целиком, так как это может быть выполнено по требованию.

При написании статьи использовались материалы How Not To Code.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
1 комментарий
0

в 2019 можно было бы и что-то поновее накопать.

Для комментирования необходимо авторизоваться