Новые Функции C#11
Команда .NET уже начала работу над функциями, которые будут включены в C# 11 и .NET 7. Сегодня рассмотрим некоторые из них.
1. Усовершенствования интерполированных строк
В настоящее время поддерживается два типа интерполированных строк:
- Обычная интерполяция:
$""
- Дословная интерполяция: $@""
Основное отличие состоит в том, что дословно интерполированные строки могут содержать несколько строк, и экранировать нужно только кавычки. В обычных интерполированных строках для новой строки нужно использовать спец символы /r/n. Теперь в обычных интерполированных строках можно будет использовать что-то вроде:var v =2. Шаблоны списков
$"Результат: { this.Is.Something()
.That.I.Should(
be + able)[
to.Wrap()] }.";
Они позволят нам сравнивать с массивами и списками, иметь возможность сопоставлять различные элементы или даже включать шаблоны, которые соответствуют нулю или более элементам.
Например, под шаблон
[1, 2, .., 10] подходят все следующие массивы:int[] arr1 = { 1, 2, 10 };
int[] arr2 = { 1, 2, 5, 10 };
int[] arr3 = { 1, 2, 5, 6, 7, 8, 9, 10 };
3. Проверка параметра на nullЭта новая функция создана из-за того, что стандартный код проверки параметра на
null встречается слишком часто:public static void M(string s)Теперь мы сможем использовать сокращённую запись с помощью !!:
{
if (s is null)
throw new ArgumentNullException(nameof(s));
// …
}
public static void M(string s!!)Это также может быть использовано для проверки параметров индексаторов:
{
// …
}
public string this[string key!!]В конструкторах эта функция будет действовать немного по-другому. Проверка параметров конструктора на
{ get { ... } set { ... } }
null с помощью !! будет происходить после инициализаторов полей, однако до вызова конструктора базового класса. То есть:public record Base(int len);При передаче
public record Derived(string s!!)
: Base(s.Length);
null в конструктор Derived, будет выброшено ArgumentNullException из класса Derived, а не NullReferenceException из класса Base.Если мы применим
!! к имени параметра обнуляемого ссылочного типа, компилятор выдаст предупреждение:void WarnCase<T>(Источник: https://dev.to/dotnetsafer/c-11-is-coming-5-features-that-will-blow-your-mind-3o7h
string? name!!,
// CS8995 Nullable type 'string?' is null-checked and will throw if null
// (Обнуляемый тип 'string?' проверяется на null и выбросит исключение при null)
T value1!! // OK
)