10 фич в C#, о которых вы определённо должны узнать и начать их использовать

Если вы только начали изучение C# или же решили расширить свои знания, мы нашли для вас 10 фич, знание которых позволит вам избежать ошибок, писать более понятный код и сохранить кучу времени. 

1. async / await

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

Ознакомиться подробнее

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. Операторы as и is

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