[Из песочницы] Что нового в C# 6.0?
Microsoft выпустила предварительную версию Visual studio 2015 и .Net 4.6 для разработчиков. В новом C# 6.0 несколько новых возможностей, которые могут облегчить кодинг.
В этой статье рассмотрены новые возможности языка C# 6.0. Скачать новую VS можно по ссылке: Microsoft Visual Studio Ultimate 2015 Preview
Инициализация свойств со значениямиВ C# 6.0 мы можем инициализировать свойства со значениями, написав справа от них их значение. Это поможет избежать ошибки с null и пустыми значениями свойства.Раньше:
public int Id { get; set; }
public string FirstName { get; set; }
Теперь:
public int Id { get; set; } = 1001;
public string FirstName { get; set; } = «Srinivas»;
Конкатенация строк
Каждый день нам приходится сталкиваться с конкатенацией строк. Кто-то в основном использует оператор »+», кто-то — метод string.Format (). Мне лично по душе string.Format (). Но проблемы с ним всем известны: при слишком большом количестве параметров тяжело понимать, что означают каждое число — {1}, {2}, {3}. В C# 6.0 придумали новую возможность, которая должна объединить достоинства обоих методов.Раньше:
name = string.Format («Employee name is {0}, located at {1}», emp.FirstName, emp.Location);
Теперь:
name = $«Employee name is {emp.FirstName}, located at {emp.Location}»;
Так же можно использовать условия:
name = $«Employee name is {emp.FirstName}, located at {emp.Location}. Age of employee is
{(emp.Age > 0) ? emp.Age.ToString () : «N/A»}»;
Использование лямбда-выражений
В C# 6.0 свойства и методы можно определять через лямбда-выражения. Это сильно уменьшает количество кода.Раньше:
public string[] GetCountryList ()
{
return new string[] { «Russia», «USA», «UK» };
}
Теперь:
public string[] GetCountryList () => new string[] { «Russia», «USA», «UK» };
Импорт статических классов
Все статические члены класса могут быть определены с помощью другого статического класса. Но нам приходится постоянно повторять имя данного статического класса. При большом количестве свойств приходится много раз повторять одно и то же.В C# 6.0 появилась возможность импортировать с помощью ключевого слова using статические классы. Рассмотрим все на примере использования библиотеки Math: Раньше
double powerValue = Math.Pow (2, 3);
double roundedValue = Math.Round (10.6);
Теперь:
using System.Math;
double powerValue = Pow (2, 3);
double roundedValue = Round (10.6);
Это можно использовать не только внутри класса, но и при выполнении метода: Раньше:
var employees = listEmployees.Where (i => i.Location == «Bangalore»);
Теперь:
using System.Linq.Enumerable;
var employees = Where (listEmployees, i => i.Location == «Bangalore»);
Null-условный оператор
C# 6.0 вводит новый так называемый Null-условный оператор (?.), который будет работать поверх условного оператора (?:). Он призван облегчить проверку на NULL значения.Он возвращает null значения, если объект класса, к которому применен оператор, равен null:
var emp = new Employee ()
{
Id = 1,
Age = 30,
Location = «Bangalore»,
Department = new Department ()
{
Id = 1,
Name = «IT»
}
};
Раньше:
string location = emp == null? null: emp.Location;
string departmentName = emp == null? null: emp.Department == null? null: emp.Department.Name;
Теперь:
string location = emp?.Location;
string departmentName = emp?.Department?.Name;
nameof оператор
В C# 6.0 оператор nameof будет использоваться, чтобы избежать появления в коде строковых литералов свойств. Этот оператор возвращает строковый литерал передаваемого в него элемента. В качестве параметра можно передать любой член класса или сам класс.
var emp = new Employee ()
{
Id = 1,
Age = 30,
Location = «Moscow»,
Department = new Department ()
{
Id = 1,
Name = «IT»
}
};
Response.Write (emp.Location); //result: Moscow
Response.Write (nameof (Employee.Location)); //result: Location
Await в catch и finally блоках
До C# 6.0 нельзя было использовать в блоках catch и final оператор await. Сейчас такая возможность появилась. Ее можно будет использовать для освобождения ресурсов или для ведения логов ошибок.
public async Task StartAnalyzingData ()
{
try
{
// код
}
catch
{
await LogExceptionDetailsAsync ();
}
finally
{
await CloseResourcesAsync ();
}
}
Фильтры исключений
Фильтры исключений были в CLR, и они доступны в VB, но их не было в C#. Теперь данная возможность появилась, и можно накладывать дополнительный фильтр на исключения:
try
{
//Вызываем исключение
}
catch (ArgumentNullException ex) if (ex.Source == «EmployeeCreation»)
{
//Нотификация об ошибки
}
catch (InvalidOperationException ex) if (ex.InnerException!= null)
{
//Нотификация об ошибки
}
catch (Exception ex) if (ex.InnerException!= null)
{
//Сохраняем данные в лог
}
Инициализация Dictionary
В C# 6.0 добавлена возможность инициализации Dictionary по ключу значения. Это должно упростить инициализацию словарей.Например, для JSON объектов:
var country = new Dictionary