Новведения в C# 6.0

» опубликован
Читай на DevTribe.ru!

Недавно 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"
}


Просмотров: 3 695

Hanabishi #1 - 3 года назад 1
Уже частично видел где-то, сахарок :3
alexprey #2 - 3 года назад 0
Hanabishi, да это сейчас быстренько по все интернету расползется, решил тоже не отставать на данную тему)
В принципе для меня тут больше нравится то что они добавили фильтрацию исключений и сменили способ инициализации словарей, к остальному я как-то равнодушен) Хотя пожалуй, мне еще понравилась короткая запись маленьких методов)
Kozinaka #3 - 3 года назад (отредактировано ) 0
DisplayName = "\{emp.FirstName}, \{emp.SecondName} [\{emp.Status}] at \{emp.LocationName}";
Фарш какой-то. Не, этим я пользоваться не буду.
А так много приятной вкусноты. :)
GeneralElConsul #4 - 3 года назад 0
Жаль, что юнити поддерживает старые версии C#.
Hellfim #5 - 3 года назад 0
Мне больше всего Nullable оператор новый понравился.
Devion #6 - 3 года назад 0
  • Нативный нуллейбл эт прям то что я люблю. Можно будет забыть про With(x => x.) конструкции
  • Импорт статичных классов - ну неужели!
  • Укороченный формат.стринг - радость
  • Коротенькие лямбда методы - лично меня радует :)
GeneralElConsul, если они хотя бы пятый шарп поддерживать начнут - уже приятно будет с dynamic и async
lentinant #7 - 3 года назад 2
Фарш какой-то. Не, этим я пользоваться не буду.
Лично мне нравится. Никаких тебе String.Format, никаких плюсований ToString между собой. Наверно, недавнее изучение Ruby повлияло. Недостаток вижу только один - локализатору, который пишет эту строчку в каком-то внешнем файле, и не имеет понятия о том, какие переменные будут задействованы в коде, куда проще прописать вместо переменной {0}, {1} и т.д..
alexprey #8 - 3 года назад 0
lentinant, удобно только для маленьких конструкций, для больших мне лично реально проще выносить с использованием {0}, {1}. Ну и старый вариант никто не отменил
lentinant #9 - 3 года назад 0
alexprey, так я и не говорил, что старыми методами не будут пользоваться. Недостаток - в плане недостаток нового метода, а не "недостаток того, что старый метод убрали".
ScorpioT1000 #10 - 3 года назад (отредактировано ) 1
У автора проблемы tsya.ru =(
И все знаки препинания перепутал. Читать реально тяжело.
Kozinaka #11 - 3 года назад 0
ScorpioT1000, tsya.ru отличный сайт! Но в тексте всего одна ошибка на тся/ться и пара на согласование, ничего криминального.
alexprey #12 - 3 года назад 0
ScorpioT1000, прости, у меня вечно проблема с этим, но я честно старался ((
Покажете, я исправлю
ScorpioT1000 #13 - 3 года назад (отредактировано ) 2
функциональность в C# является написание
Но_ к сожалению_ у них
был принципиальный недостаток, не было возможности не тот знак
В целом_ в большинстве
разобраться_ где и что расположено
возможность избавится опять не попал
особенностей в новой спецификации, это не тот знак
намного удобнее_ чем
alexprey #14 - 3 года назад 1
ScorpioT1000, спасибо, исправил
sb3d #15 - 3 года назад 0
Когда всё зависит от решений одной компании, это ненадёжно. Захочет Майкрософт через год все стандарты си-шарпа поменять, и бегай, исправляй программу.
alexprey #16 - 3 года назад 2
sb3d, существует такое понятие как обратная совместимость
ПС. Кое кто выложил исходники ядра CLR :3