C# — Nested object initializer syntax

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.

Źródła

- Dokumentacja C# - 7.6.10.2 - Object Initializer

Opublikowano 12 października 2014

Blog o programowaniu
Dariusz Woźniak · GitHub · LinkedIn · Twitter · Goodreads