Полное руководство по языку программирования С# 14 и платформе .NET 10 / Что нового

Нововведения в C# 11

Начальный ⏱ 3 мин чтения 👁 2 🕓 обновлено 11.08.2026

Паттерны списков

Паттерны списков (list pattern) позволяют сопоставлять выражения со списками и массивами. Можно сопоставлять для списка-паттерна можно установить все элементы массивы:


[2, 3, 4, 5] // этот паттерн соответствует любому массиву/списку, 
            // который равен [2, 3, 4, 5]

Также с помощью символа подчеркивания _ можно задать произвольный элемент, значение которого не имеет значения:


[_, 5] // этот паттерн соответствует любому массиву/списку из двух элементов
        // где второй элемент равен 5 (например, [1, 5] или [25, 5])

И, кроме того, с помощью slice-паттерна .. можно задать произвольное количество элементов:


[2, .., 5] // этот паттерн соответствует любому массиву/списку, где первый элемент равен 2
        // а последний элемент равен 5, а между 2 и 5 может быть произвольное количество произвольных элементов
        // (например, [2, 5] или [2, 3, 9, 5])

Пример применения:


Console.WriteLine(GetNumber(new[] { 2, 3, 5 }));        // 1
Console.WriteLine(GetNumber(new[] { 2, 4, 5 }));        // 2
Console.WriteLine(GetNumber(new[] { 2, 3, 4, 5 }));     // 3
Console.WriteLine(GetNumber(new[] { 1, 2, 3 }));        // 4
Console.WriteLine(GetNumber(new int[] { }));            // 4

int GetNumber(int[] values) => values switch
{
    [2, 3, 5] => 1,
    [2, _, 5] => 2,
    [2, .., 5] => 3,
    [..] => 4
};

Обобщения в атрибутах

В C# 11 можно определять обобщенные классы атрибутов:


class C
{
    [Reader<int>]
    public void M() 
    {
    }
}

class ReaderAttribute<T> : Attribute
{
}

Многострочные строки

С помощью трех пар двойных кавычек можно оформить многострочный текст, в том числе с применением интерполяции:


Print();
PrintValue("hello");

void Print()
{
    string text = """
              <element attr="content">
                <body>
                </body>
              </element>
              """;
    Console.WriteLine(text);
}

void PrintValue(string val)
{
    string text = $"""
              <element attr="content">
                <body>
                {val}
                </body>
              </element>
              """;
    Console.WriteLine(text);
}

Строковые литералы UTF-8

C# 11 позволяет автоматически сконвертировать строки с символами UTF-8 в их бинарное представление в виде объекта ReadOnlySpan<byte>.


ReadOnlySpan<byte> span2 = "hello"u8; 

Чтобы указать, что строка представляет utf-8, к строке добавляется суффикс u8

Файл как область видимости

C# 11 добавил еще один модификатор видимости - file, который с применяется к классам, структурам, делегатам, перечислениям, интерфейсам. Типы с этим модификаторо могут использоваться только внутри текущего файла кода.


file class Person
{
}

Данный модификатор не может использоваться в паре с другими модификаторами.

модификатор required

Модификатор required (добавлен в C# 11) указывает, что поле или свойства с этим модификатором обязательно должны быть инициализированы. Например, в следующем примере мы получим ошибку:


Person tom = new Person();  // ошибка - свойства Name и Age не инициализированы
public class Person
{
    public required string Name { get; set; }
    public required int Age { get; set; }
}

Здесь свойства Name и Age отмечены как обязательные для инициализации с помощью модификатора required, поэтому необходимо использовать инициализатор для их инициализации:

Person tom = new Person { Name = "Tom", Age = 38 }; // ошибки нет

Причем не важно, устанавливаем эти свойства в конструкторе или инициализируем при определении, все равно надо использовать инициализатор для установки их значений. Например, в следующем примере мы получим ошибку:


Person bob = new Person("Bob"); // ошибка - свойства Name и Age все равно надо установить в инициализаторе

public class Person
{
    public Person(string name)
    {
        Name = name;
    }
    public required string Name { get; set; }
    public required int Age { get; set; } = 22;
}

Проверь себя

📋 Тест по теме «Нововведения в C# 11» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

[_____, 3, 4, 5] // этот паттерн соответствует любому массиву/списку, 
            // который равен [2, 3, 4, 5]
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

[_, _____] // этот паттерн соответствует любому массиву/списку из двух элементов
        // где второй элемент равен 5 (например, [1, 5] или [25, 5])
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

[_____, .., 5] // этот паттерн соответствует любому массиву/списку, где первый элемент равен 2
        // а последний элемент равен 5, а между 2 и 5 может быть произвольное количество произвольных элементов
        // (например, [2, 5] или [2, 3, 9, 5])
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Console.WriteLine(GetNumber(_____[] { 2, 3, 5 }));        // 1
Console.WriteLine(GetNumber(new[] { 2, 4, 5 }));        // 2
Console.WriteLine(GetNumber(new[] { 2, 3, 4, 5 }));     // 3
Console.WriteLine(GetNumber(new[] { 1, 2, 3 }));        // 4
Console.WriteLine(GetNumber(new int[] { }));            // 4

int GetNumber(int[] values) => values switch
{
    [2, 3, 5] => 1,
    [2, _, 5] => 2,
    [2, .., 5] => 3,
    [..] => 4
};
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class C
{
    [Reader<int>]
    public void M() 
    {
    }
}

class _____<T> : Attribute
{
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

[2, _____, _____, 5] // этот паттерн соответствует любому массиву/списку, 
            // который равен [2, 3, 4, 5]
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

[_, _____] // этот паттерн соответствует любому массиву/списку из двух элементов
        // где второй элемент равен 5 (например, [1, 5] или [_____, 5])
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

        // (например, [2, 5] или [2, 3, 9, 5])
[2, .., 5] // этот паттерн соответствует любому массиву/списку, где первый элемент равен 2
        // а последний элемент равен 5, а между 2 и 5 может быть произвольное количество произвольных элементов
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Нововведения в C# 11»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Нововведения в C# 11», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

[2, 3, 4, 5] // этот паттерн соответствует любому массиву/списку, 
            // который равен [2, 3, 4, 5]
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Нововведения в C# 11»
+30 XP

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

[_, 5] // этот паттерн соответствует любому массиву/списку из двух элементов
        // где второй элемент равен 5 (например, [1, 5] или [25, 5])
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Нововведения в C# 11»
+50 XP

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

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Нововведения в C# 11»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Нововведения в C# 11». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.