День 1128. #ЧтоНовенького
Новые Функции C#11
Команда .NET уже начала работу над функциями, которые будут включены в C# 11 и .NET 7. Сегодня рассмотрим некоторые из них.
1. Усовершенствования интерполированных строк
В настоящее время поддерживается два типа интерполированных строк:
- Обычная интерполяция: $""
- Дословная интерполяция: $@""
Основное отличие состоит в том, что дословно интерполированные строки могут содержать несколько строк, и экранировать нужно только кавычки. В обычных интерполированных строках для новой строки нужно использовать спец символы /r/n. Теперь в обычных интерполированных строках можно будет использовать что-то вроде:
var v =
$"Результат: { this.Is.Something()
.That.I.Should(
be + able)[
to.Wrap()] }.";
2. Шаблоны списков
Они позволят нам сравнивать с массивами и списками, иметь возможность сопоставлять различные элементы или даже включать шаблоны, которые соответствуют нулю или более элементам.
Например, под шаблон [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>(
string? name!!,
// CS8995 Nullable type 'string?' is null-checked and will throw if null
// (Обнуляемый тип 'string?' проверяется на null и выбросит исключение при null)
T value1!! // OK
)
Источник: dev.to/dotnets…ind-3o7h