Что нового в C# 7.1

C# 7.1 это первый релиз данного языка содержащий точку в версии. То есть это первая версия, содержащая минорные изменения. Изменений, действительно, не очень много, но они стоят того, чтобы о них рассказать.

Для начала, вам нужно убедиться, что поддержка C# 7.1 включена в вашем проекте. Перейдите в настройки проекта, зайдите в раздел "Build", затем "Advanced" и в "Language version" выберете 7.1:

async Main метод

В C# до версии 7.1 нельзя было применять async к методу Main. И, следовательно, wait так же не могли использовать. Из-за этого приходилось использовать Result или GetResult в подобных методах, например, как здесь:

static void Main(string[] args)
{
    var client = new HttpClient();
    string uri = "http://flash2048.com";
    var  response = client.GetAsync(uri).Result;
    var responseContent = response.Content.ReadAsStringAsync();
}

Но в версии 7.1 мы можем написать так:

static async Task Main(string[] args)
{
    var client = new HttpClient();
    string uri = "http://flash2048.com";

   var  response = await client.GetAsync(uri);
   var responseContent = response.Content.ReadAsStringAsync();
}

Больше не нужно использовать "велосипеды" или делать "прослойки", чтобы использовать асинхронные методы.

Значение по умолчанию для литеральных выражений

Использовать default можно было и раньше, но польза от использования была сомнительна, так как делалось это следующим образом:

int i = default(int);
string s = default(string);
Func<string, bool> isCorrect = default(Func<string, bool>);

То есть приходилось явно указывать тип, значение по умолчанию, которого нужно было применить.

С приходом C# 7.1 мы можем писать так:

int i = default;
string s = default;
Func<string, bool> isCorrect = default;

Помимо инициализации переменных значениями по умолчанию, использовать мы можем в следующих случаях:

Задавать значение по умолчанию для необязательного параметра

public static T GetValueOrDefault<TKey, T>(this Dictionary<TKey, T> dict, TKey key,
    T defaultVaule = default)
{
    if (dict != null)
    {
        //код метода
    }
    return defaultVaule;
}

Передавать в качестве аргумента вызова метода:

public IEnumerable GetAllAvailableValues() => GetAvailableForDisplay(default);

public IEnumerable GetAvailableForDisplay(Func<string, bool> validate)
{
    // код метода

    return null;
}

Использовать в качестве возвращаемого значения:

public static T GetValue()
{
    //код метода

    return default;
}

При работе с дженериками, преимущества использования default наиболее очевидны.

Прогнозируемые имена элементов кортежей

Прогнозируемые имена дают небольшое усовершенствование для кортежей, которые были добавлены в версии 7.0

Например, мы писали подобный код:

int age = 27;
string name = "Andrei";

var pair = (age: age, name: name);

Console.WriteLine($"Name: {pair.name}, age: {pair.age}");

Здесь можно видеть, что нам пришлось вручную задавать имена переменных в кортеже.

Сейчас можно сделать следующее:

int age = 27;
string name = "Andrei";

var pair = (age, name);

Console.WriteLine($"Name: {pair.name}, age: {pair.age}");

Имена переменных, при таком подходе, будут созданы автоматически. Это небольшое изменение позволяет избежать написание лишнего кода.

Все мы можем наблюдать, как активно развивается язык C#. Под каждым релизом можно наблюдать комментарии вида "это украдено из Python", "это уже было в F#". Ведь это означает, что язык получает всё лучшее, что есть в других языках и это радует.

На этом всё.
Приятного программирования.

Добавить комментарий