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

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 можно было бы и что-то поновее накопать.

Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто