我是.NET的新手,我刚刚看到了这段代码。 {}
中的内容不是我以前见过的语法,所以我不完全确定它是什么。
var action = new DynamicAction(txnType, schema)
{
ThreadMode = ThreadMode.GUI,
IsMultipleSelectionAllowed = false
};
看起来它只是分配成员变量,但为什么不只是正常地与构造函数的其余部分一起做?
答案 0 :(得分:5)
是的,它在构造中分配属性,相当于:
var action = new DynamicAction(txType, schema);
action.ThreadMode = ThreadMode.GUI;
action.IsMultipleSelectionAllowed = false;
这种方法可用于:
如果您没有将对象分配给局部变量,则此功能特别有用:
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
};
它曾用于为ThreadMode
和IsMultipleSelectionAllowed
属性分配值。
它与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
};
创建实例并为属性ThreadMode
和IsMultipleSelectionAllowed
分配值。
在内部(在封面下)运行时创建如下所示的实例
DynamicAction tempobj = new DynamicAction(txnType, schema);
tempobj.ThreadMode = ThreadMode.GUI;
tempobj.IsMultipleSelectionAllowed = false;
action = tempobj;
因此,我们不会使用未构造的(OR)中途构造对象,这在对象中无用(如果在创建对象时发生任何运行时异常)。