Новведения в 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 собирается поменять синтаксис строки на такой:
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"
}
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
29
9 лет назад
0
Hanabishi, да это сейчас быстренько по все интернету расползется, решил тоже не отставать на данную тему)
В принципе для меня тут больше нравится то что они добавили фильтрацию исключений и сменили способ инициализации словарей, к остальному я как-то равнодушен) Хотя пожалуй, мне еще понравилась короткая запись маленьких методов)
0
14
9 лет назад
Отредактирован Kozinaka
0
DisplayName = "\{emp.FirstName}, \{emp.SecondName} [\{emp.Status}] at \{emp.LocationName}";
Фарш какой-то. Не, этим я пользоваться не буду.
А так много приятной вкусноты. :)
0
9
9 лет назад
0
Жаль, что юнити поддерживает старые версии C#.
0
30
9 лет назад
0
Мне больше всего Nullable оператор новый понравился.
0
27
9 лет назад
0
  • Нативный нуллейбл эт прям то что я люблю. Можно будет забыть про With(x => x.) конструкции
  • Импорт статичных классов - ну неужели!
  • Укороченный формат.стринг - радость
  • Коротенькие лямбда методы - лично меня радует :)
GeneralElConsul, если они хотя бы пятый шарп поддерживать начнут - уже приятно будет с dynamic и async
2
26
9 лет назад
2
Фарш какой-то. Не, этим я пользоваться не буду.
Лично мне нравится. Никаких тебе String.Format, никаких плюсований ToString между собой. Наверно, недавнее изучение Ruby повлияло. Недостаток вижу только один - локализатору, который пишет эту строчку в каком-то внешнем файле, и не имеет понятия о том, какие переменные будут задействованы в коде, куда проще прописать вместо переменной {0}, {1} и т.д..
0
29
9 лет назад
0
lentinant, удобно только для маленьких конструкций, для больших мне лично реально проще выносить с использованием {0}, {1}. Ну и старый вариант никто не отменил
0
26
9 лет назад
0
alexprey, так я и не говорил, что старыми методами не будут пользоваться. Недостаток - в плане недостаток нового метода, а не "недостаток того, что старый метод убрали".
1
37
9 лет назад
Отредактирован ScorpioT1000
1
У автора проблемы tsya.ru =(
И все знаки препинания перепутал. Читать реально тяжело.
0
14
9 лет назад
0
ScorpioT1000, tsya.ru отличный сайт! Но в тексте всего одна ошибка на тся/ться и пара на согласование, ничего криминального.
0
29
9 лет назад
0
ScorpioT1000, прости, у меня вечно проблема с этим, но я честно старался ((
Покажете, я исправлю
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.