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#". Ведь это означает, что язык получает всё лучшее, что есть в других языках и это радует.
На этом всё.
Приятного программирования.