Szintén a C# 9.0 újdonsága a with
kulcsszó. A megértéséhez ismét visszanyúlok a Point
record típusunkhoz.
Tételezzük fel, hogy készítettünk egy példányt belőle, amiben szeretnénk módosítani az egyik tulajdonság értékét és a módosítás után egy új példányt visszaadni. Ebben az esetben létre kellett hoznunk egy metódust, ami megtette ezt nekünk. Viszont ha 10 tulajdonság van az osztályunkban és ezek közül bármelyik képezheti a módosítás alapját, akkor könnyen belátható, hogy legalább 10 metódust kellene írnunk, ami igen unalmas és később a karbantartásuk sok problémát szülhet. Ezen felül, ha egyszerre több értéket is szeretnénk módosítani, akkor már célszerű egy Builder tervezési mintát elővenni, amit megintcsak le kell implementálni, majd karbantartani.
Ezen problémán segít a with
kulcsszó bevezetése. Használatával könnyen készíthetünk módosított változatokat a record típusainkról.
//Típus definíciója
record Point(double X, double Y);
//példányosítás
Point a = new Point
{
X = 1,
Y = 2,
}
//a másolsása és X értékének módosítása
Point b = a with { X = 4; }
//a másolása, módosítás nélkül
pont c = a with { }
Természetesen több tulajdonság módosítására is lehetőségünk van egyszerre:
Point b = a with
{
X = 4,
Y = 8,
}
Utóbbi példa tipikusan az állatorvosi ló esete. A b
objektumnak semmi hasonlóságot nem fog mutatni a
objektumhoz, mivel mind a két tulajdonságát felülírjuk. Éles kód esetén egy new
operátoros példányosítás célszerűbb és átláthatóbb ilyen esetben.