Ответ
Immutable-объекты (неизменяемые объекты) — это объекты, состояние которых невозможно изменить после их создания. Любая операция, которая выглядит как модификация, на самом деле возвращает новый экземпляр объекта с изменёнными данными.
Ключевые преимущества:
- Потокобезопасность: Не требуют блокировок при использовании в многопоточных сценариях, так как данные только для чтения.
- Предсказуемость: Отсутствие побочных эффектов упрощает рассуждение о поведении кода.
- Упрощение отладки: Состояние объекта фиксировано с момента создания.
Примеры в C#:
-
Тип
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 - это разные объекты -
Тип
string:string s1 = "Hello"; string s2 = s1.Replace('H', 'J'); // Возвращает новую строку "Jello", s1 остаётся "Hello" -
Реализация вручную (до 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). - Данные, передаваемые между потоками или задачами.
- Функциональные подходы к программированию.