Я не знаю, как называется этот шаблон / структура / код c # - PullRequest
2 голосов
/ 30 сентября 2011

Я пытался найти название для чего-то, но, не зная этого имени, мне трудно найти ответ. Это что-то вроде уловки 22. Я надеялся, что если я опубликую пример, кто-то там может его узнать.

По сути, это способ инициализации любого количества открытых свойств объекта без использования конструктора.

Например, если я хочу динамически добавить текстовое поле в мою winform, я мог бы:

System.Windows.Forms.TextBox tb_FirstName = new System.Windows.Forms.TextBox()
{
    Location = new System.Drawing.Point(0, 0),
    Name = "tb_FirstName",
    Size = new System.Drawing.Size(100, 20),
    TabIndex = 1
};
frm_MyForm.Controls.Add(tb_FirstName);

Кто-нибудь знает, как это называется? Кроме того, есть ли причина, почему я должен избегать этого? Я предпочитаю, как приведенный выше код читает, а не индивидуально настраивая свойства как таковые:

System.Windows.Forms.TextBox tb_FirstName = new System.Windows.Forms.TextBox();
tb_FirstName.Location = new System.Drawing.Point(0, 0);
tb_FirstName.Name = "tb_FirstName";
tb_FirstName.Size = new System.Drawing.Size(100, 20);
tb_FirstName.TabIndex = 1;

frm_MyForm.Controls.Add(tb_FirstName);

В основном я хочу знать имя первого примера, чтобы я мог немного почитать его.

Ответы [ 2 ]

10 голосов
/ 30 сентября 2011

Это называется инициализатором объекта .

Одна потенциальная проблема с их использованием - использование инициализатора объекта для объекта в операторе using.Если какой-либо из установщиков свойств выдает исключение или оценивает код для значения свойства, dispose никогда не будет вызываться для объекта.

Например:

        using (Bling bling = new Bling{ThrowsException = "ooops"})
        {
            //Some code...
        }

Экземпляриз Bling будет создан, но поскольку свойство ThrowsException вызывает исключение, Dispose никогда не будет вызвано.

1 голос
/ 30 сентября 2011

Как говорит @chibacity, это инициализатор объекта.Имейте в виду, что использование инициализатора не обходит конструктор.Конструктор по-прежнему должен вызываться.

Кстати, () не требуется, если вы используете конструктор по умолчанию для инициализатора.Это также работает:

var tb_FirstName = new TextBox {
    Location = new System.Drawing.Point(0, 0),
    Name = "tb_FirstName",
    Size = new System.Drawing.Size(100, 20),
    TabIndex = 1
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...