Sobes.tech
Senior
150
questionbank

Какие преимущества предлагает C# 12?

Ответ от нейросети

sobes.tech AI

C# 12 предлагает ряд улучшений, среди которых:

  • Первичные конструкторы для структур и классов: Упрощают инициализацию членов, позволяя объявлять параметры конструктора непосредственно в сигнатуре типа.

    // Пример для класса
    public class Point(int x, int y)
    {
        public int X { get; } = x;
        public int Y { get; } = y;
    }
    
    // Пример для структуры
    public struct PointS(int x, int y)
    {
        public int X { get; } = x;
        public int Y { get; } = y;
    }
    
  • Псевдонимы любого типа: Позволяют создавать более читаемые имена для сложных или вложенных типов.

    using PointList = System.Collections.Generic.List<(int x, int y)>;
    
    public class Example
    {
        private PointList _points; // Использование псевдонима
    }
    
  • Интерсепторы (experimental): Позволяют перехватывать вызовы методов и выполнять другой код вместо исходного. Используется атрибут [InterceptsLocation]. Важно: это экспериментальная функция и может быть удалена или изменена в будущих версиях.

    // Требуется указать путь к исходному файлу и номер строки/позиции целевого вызова
    [System.Runtime.CompilerServices.InterceptsLocation("C:\\ProjectPath\\MyFile.cs", line: 10, character: 5)]
    public static void InterceptedMethod()
    {
        System.Console.WriteLine("Вызов перехвачен!");
    }
    
  • Встроенные коллекции: Новый синтаксис для инициализации коллекций с использованием синтаксиса на основе массивов.

    System.Collections.Generic.List<int> numbers = [1, 2, 3, 4, 5];
    int[] primes = [2, 3, 5, 7, 11];
    
  • Параметры по умолчанию в лямбда-выражениях: Позволяют задавать значения по умолчанию для параметров лямбда-выражений.

    var add = (int x, int y = 0) => x + y;
    System.Console.WriteLine(add(5));    // Выведет 5
    System.Console.WriteLine(add(5, 3)); // Выведет 8
    
  • Аттрибут [EnumeratorCancellation]: Новый атрибут для более простого управления отменой в асинхронных итераторах.

    public async System.Collections.Generic.IAsyncEnumerable<int> GetDataAsync([System.Runtime.CompilerServices.EnumeratorCancellation] System.Threading.CancellationToken cancellationToken = default)
    {
        // Использование cancellationToken внутри метода
        await Task.Delay(100, cancellationToken);
        yield return 1;
    }