Что такое immutable-объекты в C#?

«Что такое immutable-объекты в C#?» — вопрос из категории C# Core, который задают на 32% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Immutable-объекты (неизменяемые объекты) — это объекты, состояние которых невозможно изменить после их создания. Любая операция, которая выглядит как модификация, на самом деле возвращает новый экземпляр объекта с изменёнными данными.

Ключевые преимущества:

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

Примеры в C#:

  1. Тип record (рекомендуемый способ):

    public record Person(string Name, int Age); // Объявление иммутабельного типа
    
    var person1 = new Person("Alice", 30);
    var person2 = person1 with { Age = 31 }; // Создаёт новый экземпляр Person
    Console.WriteLine(person1 == person2); // False - это разные объекты
  2. Тип string:

    string s1 = "Hello";
    string s2 = s1.Replace('H', 'J'); // Возвращает новую строку "Jello", s1 остаётся "Hello"
  3. Реализация вручную (до C# 9):

    public class ImmutablePoint
    {
        public int X { get; } // Свойства только для чтения
        public int Y { get; }
    
        public ImmutablePoint(int x, int y)
        {
            X = x;
            Y = y;
        }
    
        public ImmutablePoint WithX(int newX) => new ImmutablePoint(newX, this.Y);
        public ImmutablePoint WithY(int newY) => new ImmutablePoint(this.X, newY);
    }

Типичные сценарии использования:

  • Объекты-значения (DTO, ViewModel, конфигурации).
  • Ключи в коллекциях (Dictionary, HashSet).
  • Данные, передаваемые между потоками или задачами.
  • Функциональные подходы к программированию.