Какие полезные функции появились в последних версиях C#?

«Какие полезные функции появились в последних версиях C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C# 10 и 11 появилось несколько важных функций, повышающих продуктивность и читаемость кода.

Ключевые нововведения:

  • Record structs (C# 10): Иммутабельные структуры с автоматически генерируемыми методами Equals, GetHashCode и ToString. Идеальны для небольших данных, передаваемых по значению.

    public readonly record struct Point(int X, int Y);
    var p1 = new Point(1, 2);
    var p2 = p1 with { X = 3 }; // Новая запись с измененным X
  • Global using directives (C# 10): Позволяют объявить директиву using один раз для всего проекта, убирая её из каждого файла.

    // GlobalUsings.cs
    global using System;
    global using System.Collections.Generic;
  • File-scoped namespaces (C# 10): Упрощает объявление пространства имён, уменьшая отступы во всём файле.

    namespace MyApp.Services; // Фигурные скобки для всего файла не нужны
    public class UserService { ... }
  • Улучшения pattern matching (C# 10/11): Расширенные реляционные паттерны и паттерны в списках.

    bool IsLetter(char c) => c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z');
  • Raw string literals (C# 11): Удобны для записи JSON, XML, SQL или многострочного текста без экранирования кавычек.

    string json = """
    {
        "name": "John",
        "age": 30
    }
    """;
  • Required members (C# 11): Гарантирует инициализацию свойств или полей при создании объекта.

    public class Person
    {
        public required string FirstName { get; init; }
        public required string LastName { get; init; }
    }
    // new Person(); // Ошибка компиляции
    var p = new Person { FirstName = "John", LastName = "Doe" }; // OK