初始化语法

时间:2010-01-07 12:17:07

标签: c# .net object-initializers

我喜欢C#3 initializer syntax并且使用它很多,但今天在查看Reflector时,出现了以下内容:

var binding = new WSHttpBinding
{
  ReaderQuotas = { MaxArrayLength = 100000 },
  MaxReceivedMessageSize = 10485760
};

起初我认为这是一个错误,但它确实编译了!我猜我一直都在学习新东西。 :)

据我所知,它设置了MaxArrayLength的{​​{1}}属性的ReaderQuotas属性。

这种语法是否会创建一个新的WSHttpBinding对象,然后设置该属性,还是假设该属性已经初始化?这是用于初始化“子”属性的一般方法吗?

我发现语法有点令人困惑......

2 个答案:

答案 0 :(得分:22)

不,除非您使用= new SomeType {...}

,否则不会创建新对象
var binding = new WSHttpBinding
{
    ReaderQuotas = new XmlDictionaryReaderQuotas { MaxArrayLength = 100000 },
    MaxReceivedMessageSize = 10485760
};

您的示例显示了用于设置现有子对象属性的初始化程序语法。在集合上调用“添加”方法也有类似的语法。

您的代码广泛可与:

相媲美
var binding = new WSHttpBinding();
binding.ReaderQuotas.MaxArrayLength = 100000;
binding.MaxReceivedMessageSize = 10485760;

答案 1 :(得分:14)

我同意这有点令人困惑。

你应该阅读第7.6.10.2节 规范;这一切都解释了 那里。例如:

  

指定的成员初始值设定项   等号后的表达式   处理方式与处理方式相同   转让给外地或财产。

     

指定一个的成员初始值设定项   等于之后的对象初始值设定项   sign是一个嵌套的对象初始化器,   即嵌入式的初始化   宾语。而不是分配新的   对于该领域或财产的价值,   嵌套对象中的赋值   初始化程序被视为分配   对该领域或财产的成员。   嵌套对象初始值设定项不能   应用于具有值的属性   类型,或带有一个只读字段   价值类型。

     

指定a的成员初始值设定项   之后的集合初始化程序   等号是一个初始化的   嵌入式集合。代替   将新集合分配给   领域或财产,给出的要素   在初始化程序中添加到   字段引用的集合或   属性。