Стартовая страницаНовости

Несколько фич в C# которые обязательны к использованию

Немного о фичах, о существовании которых надо обязательно помнить при разработке программ на C#. Некоторые, просто облегчают жизнь, но есть и такие, что не позволят вашим волосам поседеть раньше времени!

.

async / await

В .NET 4.5 во фреймворк были добавлены два новых ключевых слова async и await, цель которых - упростить написание асинхронного кода. Вместе с функциональностью задач Task они составляют основу новой модели асинхронного программирования в .NET, которая называется Task-based Asynchronous Pattern.

Операторы async и await используются вместе для создания асинхронного метода. Такой метод, определенный с помощью модификатора async и содержащий одно или несколько выражений await, называется асинхронным методом.

Используйте async/await-паттерн во время долгих операций блокирующих пользовательский интерфейс. Это действительно просто. 

 

Инициализаторы коллекций и объектов

Чтобы создать экземпляр класса, массивы и коллекции теперь можно использовать инциализаторы, но почему-то ими мало кто пользуется, продолжая создавать велосипеды, костыли и сотни строк лишнего кода:

//Некий класс
public class Employee {
  public string Name {get; set;}
  public DateTime StartDate {get; set;}
}


//Создание объекта типа Employee
Employee emp = new Employee {Name="John Smith", StartDate=DateTime.Now()};

И все. Ну ведь действительно это гораздо проще и быстрее написать, чем создавать конструктор для этого класса? Хотя на MSDN где-то было написано, что заменять конструкторы, инициализатром нельзя.

 

?? оператор объединения со значением Null

Оператор ?? возвращает значение выражения на левой стороне от себя пока его значение не Null, в случае же если левая сторона выражения Null, то вернется выражеие с правой стороны оператора.

//Может быть null
var someValue = service.GetValue();
var defaultValue = 23
//result примет значение 23 в том случае если someValue - Null
var result = someValue ?? defaultValue;

The ??-operator может применятся последовательно. Как-то так:

string anybody = parm1 ?? localDefault ?? globalDefault;

Так же его можно использовать для преобразования nullable типов в не nullable:

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

 

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

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

//Так делали раньше
var someString = String.Format("Some data: {0}, some more data: {1}", someVariable, someOtherVariable);
//в С# 6
var someString = $"Some data: {someVariable}, some more data: {someOtherVariable}";

Мы можем размещать между фигурными скобками целые выражения, что делает эту фичну крайне мощной.

 

?. оператор с условием NULL (появился в  C# 6)

Этот оператор используется для проверки на значения NULL перед выполнением операции доступа к элементу  или операции индексирования. Эти операторы позволяют писать меньше кода для проверок значений null, особенно если речь идет о внедрении в структуры данных.

//Null if customer or customer.profile or customer.profile.age is null
var currentAge = customer?.profile?.age;

Все! Нет больше страшного NullReferenceExceptions!

Заметим, что операторы с условием NULL выполняются по сокращенному сценарию и следовательно в некоторых  случаях их использование предпочтительней обычных условий. Если одна операция в цепочке условных операций доступа к элементу и операций индексирования возвращает значение NULL, то выполнение остальной части цепочки останавливается. 

 

Выражение nameof (появилось в C# 6)

На первый взгляд nameof не кажется важным, Но оно становится таким как только мы захотим зарефакторить свой код

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

   //...
}

Теперь как это может выглядить с nameof…

public void PrintUserName(User currentUser)
{
   //The refactoring tool will not miss this...
   if(currentUser == null)
   _logger.Error($"Argument {nameof(currentUser)} is not provided");

   //...
}

И теперь в случае изменения названия параметра функции вы всегда будете получать актуальный лог 

 

Инциализатор свойств (появилсяс C# 6)

Теперь наконец-то можно инициализировать свойства:

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

Преимуществом использования этого инициализатора является то, что мы не можем объявить setter, и это делает свойство неизменным.

 

yield

yield позволяет создать динамическитй IEnumerable. Следующий пример возвращает экспонентноциальный ряд (2, 4, 8, 16, 32, 64, 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 - очень мощная возможность, которая упрощает генерацию последовательностей.

 

0
Пока еще нет ни одного комментария. 

Дима Кононов © - разработка сайтов "под ключ".

Персональный сайт Дмитрия Кононова программиста, музыканта и просто хорошего парня.
Функционирует с 2015 года. Версия 3.0
Разработка и дизайн: Кононов Дмитрий (R)
Сейчас зарегистрированных посетителей на сайте: 0 Посмотреть подробнее...
Новостная лента RSS 2.0
Фото c сайта Закрыть окно
Закрыть