Un objet immuable est un objet dont l’état ne peut plus changer après sa création.
Toute “modification” se fait en réalité en créant une nouvelle instance, l’ancienne restant intacte.
public record Person(string Name, int Age);
var p1 = new Person("Alice", 30);
var p2 = p1 with { Age = 31 }; // nouvelle instance
➡️ p1 n’est jamais modifié.
Pas d’effet de bord : les objets ne changent jamais silencieusement.
Les objets immuables peuvent être partagés entre threads sans locking.
Pas de variables modifiées “à distance”.
recordpublic record Point(int X, int Y);
initpublic class Settings {
public int Limit { get; init; }
public string Mode { get; init; }
}
readonlypublic class Vector {
public readonly double X;
public readonly double Y;
public Vector(double x, double y) {
X = x;
Y = y;
}
}
public Vector Move(double dx, double dy) =>
new Vector(X + dx, Y + dy);
public record User(string Name, int Age);
var u1 = new User("Bob", 20);
var u2 = u1 with { Age = 21 };
public record Order(int Id, decimal Price);
Order ApplyDiscount(Order order, decimal percent) =>
order with { Price = order.Price * (1 - percent) };
public class Wrong {
public int[] Values { get; }
public Wrong(int[] values) {
Values = values; // fuite de référence
}
}
var w = new Wrong(new int[]{1,2});
w.Values[0] = 99; // la classe n'est pas immuable !
public struct MutablePoint {
public int X;
public int Y;
}
// mutable = dangereux dans les API
record autant que possibleinitImmutableArray<T>, ImmutableList<T>Les objets immuables sont naturellement thread-safe :
var config = new Config(port: 80);
// partagé entre threads → aucun problème
Pas besoin de verrouiller : l'objet ne change pas.
L’immutabilité est un concept essentiel pour écrire du code propre, robuste, thread-safe et facile à raisonner. C# fournit plusieurs outils pour la mettre en œuvre efficacement : records, init, readonly, etc.