这个.net构造函数语法是什么意思?

时间:2014-04-01 19:02:54

标签: .net syntax constructor

我是.NET的新手,我刚刚看到了这段代码。 {}中的内容不是我以前见过的语法,所以我不完全确定它是什么。

var action = new DynamicAction(txnType, schema)
                             {
                                 ThreadMode = ThreadMode.GUI,
                                 IsMultipleSelectionAllowed = false
                             };

看起来它只是分配成员变量,但为什么不只是正常地与构造函数的其余部分一起做?

6 个答案:

答案 0 :(得分:5)

是的,它在构造中分配属性,相当于:

var action = new DynamicAction(txType, schema);
action.ThreadMode = ThreadMode.GUI;
action.IsMultipleSelectionAllowed = false;

这种方法可用于:

  1. 您无法控制构造函数,也无法向其添加其他参数。
  2. 您不希望在每次调用时将一长串参数传递给构造,而只是设置您关注的参数。
  3. 如果您没有将对象分配给局部变量,则此功能特别有用:

    SomeMethod(new DynamicAction(txType, schema) { 
        action.ThreadMode = ThreadMode.GUI,
        action.IsMultipleSelectionAllowed = false }
    );
    

    在这种情况下,使用对象初始值设定项,无需创建临时局部变量。

答案 1 :(得分:4)

它是Object Initializer,您使用任何构造函数,然后分配您需要更改的属性的值。

您可以在以下位置参阅Microsoft文档:

http://msdn.microsoft.com/en-us/library/bb384062.aspx

在你的情况下,你有一个带有2个参数的构造函数,然后初始化另外2个。

答案 2 :(得分:3)

它被称为Object Initializer。在这个例子中:

var action = new DynamicAction(txnType, schema)
{
    ThreadMode = ThreadMode.GUI,
    IsMultipleSelectionAllowed = false
};

它曾用于为ThreadModeIsMultipleSelectionAllowed属性分配值。

它与LINQ一起引入,因为当您进行投影时,能够在单个操作中创建新对象并为其分配属性更方便:

var foos = bars.Select(b => new Foo { Baz = b.Qux, Corge = b.Grault });

答案 3 :(得分:2)

值得知道对象初始值设定项是在构造函数之后完成的。

例如,如果您执行以下代码:

public class Test
{
    public string Name { get; set; }

    public Test(string name)
    {
         Name = name;
    }
}
...
var t = new Test("Name1") {Name = "Name2"};
Console.WriteLine(t.Name);

结果将是“Name2”

答案 4 :(得分:0)

构造函数并不总是能够处理可在对象中修改的每个可能参数,只是常用的,或重要的必需情况,或需要对象状态固有的特殊处理的情况。如果对象中存在public字段,则可以构造对象,然后将各个字段值设置为您需要的值。它(可以说)是一种更简单的方法,可以在一个语句中初始定义一个具有所有值的对象,而无需在以后单独设置每个值,此时字段可能不被对象的构造函数参数化

答案 5 :(得分:0)

这被称为Object Initializer,并且介绍它是在.NET 3.5附带的C#3编译器中引入的。

尽管可以在任何上下文中使用对象初始值设定项,但它们在LINQ查询表达式中尤其有用。查询表达式经常使用匿名类型,只能使用对象初始值设定项进行初始化,如下面的声明所示。

var pet = new { Age = 10, Name = "Fluffy" };

使用您的代码

var action = new DynamicAction(txnType, schema)
 {
     ThreadMode = ThreadMode.GUI,
     IsMultipleSelectionAllowed = false
 };

创建实例并为属性ThreadModeIsMultipleSelectionAllowed分配值。

在内部(在封面下)运行时创建如下所示的实例

DynamicAction tempobj = new DynamicAction(txnType, schema);
tempobj.ThreadMode = ThreadMode.GUI;
tempobj.IsMultipleSelectionAllowed = false;
action = tempobj;

因此,我们不会使用未构造的(OR)中途构造对象,这在对象中无用(如果在创建对象时发生任何运行时异常)。