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*:

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.

* – Dla uproszczenia pominięto tymczasową zmienną ukrytą (hidden temporary variable)

Źródła

Dokumentacja C# – 7.6.10.2 – Object Initializer

One thought on “C#: Nested object initializer syntax

  1. Pingback: dotnetomaniak.pl

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s