Immutable object — это объект, состояние которого нельзя изменить после его создания. Любая модификация приводит к созданию нового объекта, а не изменению существующего.
Потокобезопасность:
Предсказуемость:
Кэширование и повторное использование:
Упрощение архитектуры:
Более чистый код:
public sealed class ImmutablePerson
{
public readonly string Name;
public readonly DateTime BirthDate;
public ImmutablePerson(string name, DateTime birthDate)
{
Name = name;
BirthDate = birthDate;
}
}
public record ImmutableBook(string Title, string Author, int Pages);
var immutableList = System.Collections.Immutable.ImmutableList.Create(1, 2, 3);
var newList = immutableList.Add(4); // Создает новый список
public sealed class ImmutableConfig
{
public string ConnectionString { get; }
public int Timeout { get; }
private ImmutableConfig(string connectionString, int timeout)
{
ConnectionString = connectionString;
Timeout = timeout;
}
public class Builder
{
private string _connectionString;
private int _timeout;
public Builder WithConnectionString(string value)
{
_connectionString = value;
return this;
}
public Builder WithTimeout(int value)
{
_timeout = value;
return this;
}
public ImmutableConfig Build() => new(_connectionString, _timeout);
}
}
// Вместо изменения:
var newPerson = person.WithName("New Name");
// Реализация With-метода:
public ImmutablePerson WithName(string newName) =>
new ImmutablePerson(newName, this.BirthDate);
Структуры вместо классов:
Кэширование хэш-кода:
private readonly int _hashCode;
public override int GetHashCode() => _hashCode;
public readonly struct ImmutablePoint
{
public readonly double X;
public readonly double Y;
public ImmutablePoint(double x, double y) => (X, Y) = (x, y);
public ImmutablePoint WithX(double x) => new(x, Y);
public ImmutablePoint WithY(double y) => new(X, y);
}
immutable objects — это мощный паттерн, который значительно повышает надежность и безопасность кода. В .NET есть несколько способов их реализации, от простых readonly полей до современных record типов. Их использование особенно оправдано в многопоточных средах и сложных системах, где важна предсказуемость поведения.