Добавлен alexprey,
опубликован
Недавно 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 собирается поменять синтаксис строки на такой: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"
}
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован ScorpioT1000
И все знаки препинания перепутал. Читать реально тяжело.
Покажете, я исправлю
Отредактирован ScorpioT1000
ПС. Кое кто выложил исходники ядра CLR :3