10 полезных фич в C#
Знание этих приёмов позволит вам избежать многих ошибок. Вы не только станете писать более понятный код, но и сэкономите своё время.
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;
Оператор
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.