Для получения полного доступа
зарегистрируйтесь.
Snippet,  C#

Синтаксические нововведения C# 6.0


Данный стеш не является реализацией какого-то полезного функционала, а служит лишь для ознакомления с нововведениями синтаксиса шестой версии языка C#

// ******************
// 1. Интерполяция строк
const string name = "Vasily";
var text = $"My name is {name}.";   // My name is Vasily

// ******************
// 2. Индексный инициализатор
var list = new Dictionary<string, int>
{
    ["Three"] = 3,
    ["Four"] = 4
};

// ******************
// 3. Новый способ инициализации auto-implemented свойств
public int MyProp { get; } = 3;

// ******************
// 4. Возможность объявления методов класса в стрелочной нотации лямбда
class MyClass {
	public static int Mul3(int x) => 3*x; // MyClass.Mul3(4) --> 12
}

// ******************
// 5. Оператор .? - это самое ожидаемое мной нововведение в синтаксис языка
// и я с нетерпением жду, когда другие языки (в частности JavaScript и PHP) реализуют эту идею.
// Данный оператор позволяет решить проблему проверки на null в многовложенных цепочках обращений:
var list = new List<Person>() { new Person() }; 
var chiefSurname = list[0]?.Chief?.Surname;  // Если Chief == null, в chiefSurname будет записано null
PropertyChanged?.Invoke(e)  // Вызов обработчика события при условии, что он сущестует

// ******************
// 6. nameof() - это не метод, это инструкция, аналогичная инструкции typeof(), 
// возвращает имя объекта/свойства в виде строки
var person = new Person();
Console.WriteLine(nameof(person.Surname));  // --> "Surname"

// ******************
// 7. Условные catch-блоки
try
{
    throw new ArgumentException("Blablabla","myparam");
}
// В этот catch-блок будет выполнен вход только при соответствии условия
catch (ArgumentException e) when (e.ParamName == "myparam")
{
    Console.WriteLine($"Argument {e.ParamName} is missing");
}
// Все остальные ошибки типа ArgumentException будут обработаны этим catch-блоком
catch (ArgumentException e)
{
    Console.WriteLine("Any unknown argument");
}

// ******************
// 8. Статический импорт методов. Никогда не используйте эту возможность! 
// Привожу пример лишь для полноты изложения
using static System.Console;
// теперь статические методы класса Console можно использовать без указания имени класса
ReadLine();

// ******************
// 9. Появилась возможность использовать await в блоках catch/finally
async static void Test()
{
    try
    {
        throw new Exception();
    }
    catch (Exception e)
    {
        await LogResultAsync("Site download failed", e);
    }
}

async static Task LogResultAsync(string msg, Exception e)
{
    await Task.Delay(1000).ContinueWith((r) => { Console.WriteLine(msg); });
}
  c# .NET

Автор


jestonedev
  • Reputation: 99
  • Snippets : 11
  • Revisions : 1
Подписаться

Чтобы увидеть комментарии, нужно быть участником сообщества

Регистрация