среда, 17 июня 2015 г.

Топ-10 новых возможностей C# 6.0



В данной публикации я опишу 10 наиболее важных по моему мнению возможностей языка, которые 4как ожидается появятся в C# 6.0. В настоящее время C# 6 доступен вместе с Visual Studio 2015 Preview для разработчиков. Я использовал CTP 4 Visual Studio VNext для создания примеров исходного кода описанных в данной статье.

10. Выражение как тело метода

Как часто вам доводилось писать метод, который содержит только одну строку? Теперь, c C# 6 вы можете просто использовать выражение в качестве тела метода без необходимости ограничивать его фигурными скобками.
class Employee
{
   // Method with only the expression
   public static int
      CalculateMonthlyPay(int dailyWage)
      => dailyWage * 30;
}



9. ? – Условный оператор доступа

В ранних версиях языка C#, вам всегда нужно было писать явную проверку на NULL перед использованием объекта или проперти, как показано ниже.
private void GetMiddleName(Employee employee)
{
   string employeeMiddleName = "N/A";
 
   if (employee != null && employee.EmployeeProfile
      != null)
      employeeMiddleName =
         employee.EmployeeProfile.MiddleName;
}


Тот же код на C# 6 можно переписать следующим образом.
private void GetMiddleName(Employee employee)
{
   string employeeMiddleName =
      employee?.EmployeeProfile?.MiddleName ?? "N/A";
}
Обратите внимание что значение по умолчанию указано на той же строке кода.

8. Инициализаторы авто-проперти

Используя возможность инициализации авто-проперти, разработчик может инициализировать проперти без использование приватного set и приватной локальной переменной. Код представленный ниже демонстрирует это.
class PeopleManager
{
   public List Roles { get; } =
      new List() { "Employee", "Managerial"};
}

7. Основной конструктор

Основной конструктор – позволяет передавать параметры конструктора в объявлении класса, и исзавляет от написания отдельного конструктора. В области видимости параметров значение основного конструктора находится весь класс, но их использование возможно только в процессе инициализации класса. Эту возможность удобно использовать с инициализаторами авто-проперти.
// Primary constructor
class Basket(string item, int price)
{
   // Using primary constructor parameter values
   // to do auto property initialization.
   public string Item { get; } = item;
   public int Price { get; } = price;
}

6. Объявление OUT параметра при вызове метода.

Это одно из моих любимых новшеств, потому что я никогда не был сторонником разделения объявления переменной и вызова метода. Это новшество позволит объявлять переменную для OUT параметра непосредственно в процессе вызова, как показано ниже.
public bool ConvertToIntegerAndCheckForGreaterThan10
   (string value)
{
   if (int.TryParse(value, out int convertedValue)
      && convertedValue > 10)
   {
      return true;
   }
 
   return false;
}
Обратите внимание, что та же переменная используется и в другом месте условия if.

5. Await в блоке Catch

Это важно несинтаксическое усовершенствование, которое появится в C# 6. Ключевое слово await может быть использовано внутри блока catch и finally. Это предоставляет возможность выполнять асинхронную обработку исключений или покидать процесс в случае, если исключение произошло внутри асинхронного процесса.
public async void Process()
{
   try
   {
      Processor processor = new Processor();
      await processor.ProccessAsync();
   }
   catch (Exception exception)
   {
      ExceptionLogger logger = new ExceptionLogger();
      // Catch operation also can be aync now!!
      await logger.HandleExceptionAsync(exception);
   }
}

4. Фильтры исключений

Исключения могут быть легко и просто отфильтрованы в блоке catch с помощью C# 6. Представленный пример показывает как можно обработать все исключения кроме SqlException.
public async void Process()
{
   try
   {
      DataProcessor processor = ne
   }
   // Catches and handles only non sql exceptions
   catch (Exception exception) if(exception.GetType()
      != typeof(SqlException))
   {
      ExceptionLogger logger = new ExceptionLogger();
      logger.HandleException(exception);
   }
}

3. Поддержка Using

Эта возможность разгрузить код от регулярного повторения статического класса для вызова его методов. Как и с неймспейсами, теперь использование статического класса можно подключить с использованием using.
using System;
// A static class inclusion
using System.Console;
 
namespace CSharp6Demo
{
   class Program
   {
      static void Main(string[] args)
      {
         WriteLine("Console. is not required
            as it is included in the usings!");
      }
   }
}

2. Интерполяция строк

Это может быть похожим на усовершенствование String.Format, вместо плейсхолдеров, вы можете непосредственно указвать строковое выражение или перенменные.
static void Main(string[] args)
{
   string name = "Robert";
   string car = "Audi";
   WriteLine("\{name}'s favourite car is
      {car}!");
}

1. Roslyn – новый компилятор для C# и VB

Roslyn – компилятор для языка C# 6; он имеет большое количество усовершенствований и, что самое главное, он открытый. Компилятор Roslyn также доступен как сервис, другими словами “компилятор как сервис” потому что вы можете использовать библиотеки Roslyn API для расширения функцтональности. Это только наброски того что может Roslyn. Я оставлю возможность узнать больше о компиляторе читателям самостоятельно.
Я надеюсь, статья сжато продемонстрировала возможности которые могут появится в RTM версии C# 6. Хотя стоит отдать должное – тут нету чего то сверхестественного, все усовершенствования являются эволюционными, и позволяют сделать код немного более чистым, наглядным и простым. Интеграция с Roslyn это очевидно самая главная фишка.