87. Object initializer

ראינו בעבר (טיפ מספר 18) שאפשר לאתחל Collection בצורה נחמדה.

קיימת בC# 3.0 אפשרות גם לאתחל Properties של אובייקט בצורה כזאת.

במקום לכתוב קוד כזה:

1
2
3
Person person = new Person();
person.FistName = "Jonathan";
person.LastName = "Geffen";

נוכל לכתוב את זה בצורה הזאת:

1
2
3
4
5
6
Person person =
new Person
{
FistName = "Jonathan",
LastName = "Geffen"
};

זה יוצר לנו קוד שהוא יותר קריא, ומאפשר לנו לעשות את כל האתחולים של הProperties של האובייקט במקום ריכוזי.

ככה נוכל גם לאתחל אובייקטים היררכיים בצורה כזאת:

1
2
3
4
5
6
7
8
9
10
11
Person person =
new Person
{
FistName = "Jonathan",
LastName = "Geffen",
Child = new Person
{
FistName = "Aviv",
LastName = "Geffen"
}
};

במקום ככה:

1
2
3
4
5
6
Person person = new Person();
person.FistName = "Jonathan";
person.LastName = "Geffen";
person.Child = new Person();
person.Child.FistName = "Aviv";
person.Child.LastName = "Geffen";

אפשר גם לשלב את זה עם Collection Initializer ולקבל משהו כזה

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Band blackField =
new Band
{
new Person
{
FistName = "Aviv",
LastName = "Geffen"
},
new Person
{
FistName = "Steven",
LastName = "Wilson"
}
};

במקום ככה:

1
2
3
4
5
6
7
8
9
10
11
12
13
Band blackField = new Band();
blackField.Add(new Person
{
FistName = "Steven",
LastName = "Wilson"
});
blackField.Add(new Person
{
FistName = "Aviv",
LastName = "Geffen"
});

או יותר גרוע:

1
2
3
4
5
6
7
8
9
10
11
12
13
Band blackField = new Band();
Person steeve = new Person();
steeve.FistName = "Steven";
steeve.LastName = "Wilson";
blackField.Add(steeve);
Person aviv = new Person();
aviv.FistName = "Aviv";
aviv.LastName = "Geffen";
blackField.Add(aviv);

יש לציין ששימוש בobject initializer יוצר מאחורי הקלעים במידת הצורך משתני עזר כנ"ל, למשל בדוגמה

1
2
3
4
5
6
7
8
9
10
11
Person person =
new Person
{
FistName = "Jonathan",
LastName = "Geffen",
Child = new Person
{
FistName = "Aviv",
LastName = "Geffen"
}
};

הקוד יתקמפל למשהו כזה:

1
2
3
4
5
6
7
8
Person g__initLocal1a = new Person();
g__initLocal1a.FistName = "Jonathan";
g__initLocal1a.LastName = "Geffen";
Person g__initLocal1b = new Person();
g__initLocal1b.FistName = "Aviv";
g__initLocal1b.LastName = "Geffen";
g__initLocal1a.Child = g__initLocal1b;
Person person = g__initLocal1a;

הגבלות: נוכל להשתמש בObject Initializer רק מיד אחרי Constructor.

אם מישהו אחר יוצר לנו את האובייקט (למשל Factory), ואנחנו רוצים לאתחל אותו עם Properties, לא נוכל להשתמש בObject initializer (בVB יש keyword אחר שנקרא With שמאפשר לעשות משהו דומה, גם במידה והאובייקט לא בהכרח נוצר באמצעות Constructor)


לסיכום, שימוש בObject Initializer מגדיל את הקריאות של הקוד שלנו וכדאי להשתמש בו 😃

המשך יום (לא) גשום טוב

שתף