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.