Новведения в C# 6.0
Недавно Microsoft предоставили превью новой версии Visual Studio 2015 и .NET 4.6 для разработчиков. Новая версия .NET содержит новый стандарт C# 6.0, в котором появились некоторые интересные возможности. В этой новости я постараюсь в кратце рассказать о них.
Инициализация свойст со значением по умолчанию
Самая часто используемая функциональность в C# - написание автосвойств. Но, к сожалению, у них был принципиальный недостаток - не было возможности задать значение по умолчанию, и тут приходилось либо отказываться от автосвойства, либо использовать конструктор по-умолчанию, чтобы проинициализировать данные свойства. C# 6.0 решает данную проблему.
public class A { public int Id { get; set; } public string Name { get; set; } public A() { Id = 5000; Name = "Special Name"; } }
public class A { public int Id { get; set; } = 5000; public string Name { get; set; } = "Special Name"; }
Интеграция аргументов в строку
Самый распространнеый метод, который используется для создания форматированных строк это string.Format. В большинстве случаев очень удобно использовать аргументы внесенные отдельно, а наличие ReSharper'а помогает разобраться где и что расположено. Но в C# 6.0 появилась интересная особенность, которая позволяет использовать аргументы непосредственно в самой строке.
DisplayName = string.Format("{0}, {1} [{2}] at {3}", emp.FirstName, emp.SecondName, emp.Status, emp.LocationName);
DisplayName = "\{emp.FirstName}, \{emp.SecondName} [\{emp.Status}] at \{emp.LocationName}";
Замечание: синтаксис выше работает в превью версии, однако Microsoft собирается поменять синтаксис строки на такой:
((code csharp
DisplayName = $"{emp.FirstName}, {emp.SecondName} [{emp.Status}] at {emp.LocationName}";
))
Использование лямбда выражений для маленьких функций
В C# 6.0 теперь появилась возможность избавиться от написание громоздких конструкций для методов, которые возвращали простые значения, например:
public string[] GetAvaliableNames() { return new string[] { "Alexey", "Andrey", "Maxim", "Evgeniy" }; }
public string[] GetAvaliableNames() => new string[] { "Alexey", "Andrey", "Maxim", "Evgeniy" };
Импорт статичных классов
Использование статичных методов возможно только с помощью приписки используемого класса, иногда это приводило к написанию с лишком громоздкому коду, особенно когда дело касалось работы с математическими вычислениями. В новой спецификации языка появилась возможность произвести импорт статичного класса и тогда для использования методов статичного класса не требуется приписывать имя этого класса. Давайте рассмотрим пример на основе вычисления простой математической формулы:
public static double Distance(double x1, double y1, double x2, double y2) { var dx = x1 - x2; var dy = y1 - y2; return Math.Sqrt(Math.Pow(dx, 2) + Math.Pow(dy, 2)); }
using System.Math; // ... public static double Distance(double x1, double y1, double x2, double y2) { var dx = x1 - x2; var dy = y1 - y2; return Sqrt(Pow(dx, 2) + Pow(dy, 2)); }
Nullable операторы
В C# 6.0 ввели два Nullable оператора ?. и ?:. Данные операторы обеспечивают более простую работу с условими для работы с объектами, которые могут иметь значение null.
string location = emp == null ? null : emp.Location; string departament = emp == null ? null : (emp.Departament == null ? null : emp.Departament.Name);
string location = emp?.Location; string departament = emp?.Departament?.Name;
Выражение nameof
Еще одна из интересных возможностей новой спецификации языка. Раньше при необходимости использовании имен свойств в коде ( например при работе с XAML и WPF ) приходилось создавать строковые константы для этого или писать специальные утилитные методы, которые бы преобразовывали выражения в имена свойств. Сейчас же достаточно просто использовать новое выражение nameof, который вернет имя свойства, метода, класса и т.д.
var emp = new Employee() { Id = 1, Age = 20, Location = "Russia", Name = "Alexey", Department = new Department() { Id = 1, Name = "IT" } }; Response.Write(emp.Location); //Результат: Russia Response.Write(nameof(Employee.Location)); //Результат: Location
Фильтр исключений
Еще одна из ключевых особенностей в новой спецификации - это фильтрация исключений ( "пожалуй это моя любимая особенность теперь будет :3" alexprey ). Благодаря этому теперь можно отлавливать исключения не только по их типу, но так же и добавлять дополнительные проверки, что сделает код более гибким и удобным, а так же избавит от лишних throw;
try { // Some code } catch (ApiMethodException ex) if (ex.InnerException != null) { // Crash application and notify system admins } catch (ApiMethodException ex) if (ex.IsHasParameters) { // Notify end-user about exception } catch (ApiMethodException ex) { // Notify end-user about exception } catch (ApiMethodException ex) { // Log into general logs }
Инициализация словарей
В C# 6.0 добавили новый способ инициализации словарей данных, теперь это происходит намного удобнее, чем было раньше
var map = new Dictionary<string, string> { { "key1", "value1" }, { "key2", "value2" } }
var map = new Dictionary<string, string> { ["key1"] = "value1", ["key2"] = "value2" }
Смотрите также:
Комментарии
- 1
- 2 (Текущая страница)
ScorpioT1000, http://tsya.ru отличный сайт! Но в тексте всего одна ошибка на тся/ться и пара на согласование, ничего криминального.
функциональность в C# является написание
Но_ к сожалению_ у них
был принципиальный недостаток, не было возможности // не тот знак
В целом_ в большинстве
разобраться_ где и что расположено
возможность избавится // опять не попал
особенностей в новой спецификации, это // не тот знак
намного удобнее_ чем
Когда всё зависит от решений одной компании, это ненадёжно. Захочет Майкрософт через год все стандарты си-шарпа поменять, и бегай, исправляй программу.
sb3d, существует такое понятие как обратная совместимость
ПС. Кое кто выложил исходники ядра CLR :3 //- 1
- 2 (Текущая страница)
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]