W C# istnieje mało znana składnia do inicjalizacji zagnieżdzonych obiektów (nested object initializer syntax). Po raz pierwszy zetknąłem się z nią przy okazji lektury The C# Programming Language (Covering C# 4.0), a później przy sugestii ReSharpera. Na czym polega cała zabawa? Spójrzmy na kod, za pomocą którego inicjalizujemy zagnieżdżony obiekt:
Rectangle rectangle = new Rectangle
{
P1 = { X = 0, Y = 1 },
P2 = { X = 2, Y = 3 }
};
Powyższy kod kompilowany jest do postaci (Dla uproszczenia pominięto tymczasową zmienną ukrytą, tj. hidden temporary variable).
Rectangle r = new Rectangle();
r.P1.X = 0;
r.P1.Y = 1;
r.P2.X = 2;
r.P2.Y = 3;
Pozostała część kodu wygląda następująco (całość na gist):
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
public class Rectangle
{
public Rectangle()
{
P1 = new Point();
P2 = new Point();
}
public Point P1 { get; set; }
public Point P2 { get; set; }
}
Kiedy stosować? Podaną składnią można sobie życie ułatwić, bo pozwoli nam to na skrót przy pisaniu struktur drzewiastych i zagnieżdżonych obiektów. Można też utrudnić, bo należy wziąć pod uwagę, że nie jest to powszechna technika i może budzić konsternację wśród innych osób przeglądających kod.