我不知道这个c#模式/结构/代码被调用了什么

时间:2011-09-30 14:51:23

标签: c# initialization

我一直试图找出某些东西的名字,但是如果不知道这个名字,我很难用谷歌搜索答案。这是一个很大的问题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 个答案:

答案 0 :(得分:10)

它被称为object initializer

使用它们的一个潜在问题是在using语句中为对象使用对象初始值设定项时。如果任何属性设置器抛出异常,或者评估属性值的代码,则永远不会在对象上调用dispose。

例如:

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

将创建Bling的实例,但由于属性ThrowsException会引发异常,因此永远不会调用Dispose

答案 1 :(得分:1)

正如@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
};
相关问题