2010-01-07 98 views
29

我喜欢C#3初始化语法,并使用了很多,但今天同时寻找在反射器,下面就起来:初始化语法

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

起初我还以为这是一个错误,但它确实编译!猜猜我还在不断学习新东西。 :)

从我所知道的情况来看,它设置WSHttpBindingReaderQuotas属性的MaxArrayLength属性。

该语法是否会创建一个新的ReaderQuotas对象,然后设置属性,还是假定属性已被初始化?这是人们用来初始化'孩子'属性的一般方式吗?

我确实觉得语法有点混乱......

+0

您可能感兴趣的[本文](http://www.codeducky。org/even-concise-c-object-initializers /),它讨论了这种类型的初始化器的语义和用例 – ChaseMedallion 2014-10-14 23:46:36

回答

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; 
+0

看起来是一样的,是不是只有语法上的区别?看起来好像(除非ReaderQuotas在WSHttpBinding的构造器中初始化)它应该会抛出一个异常 – James 2010-01-07 12:23:25

+0

谢谢,它只是让我感到惊讶:)我认为'添加'你的意思就像一个集合初始值设定项? – leppie 2010-01-07 12:25:09

+0

@james:我希望在这种情况下有一个异常,但是如果你不知道在构造函数中做了什么,没有源代码可能会引起混淆。一些构造函数重载可能会或可能不会初始化该属性,这会导致更多的混淆。 – leppie 2010-01-07 12:26:59

14

这是一个有点混乱,我同意。

您应该阅读 的7.6.10.2节的规范;这里全部解释为 。例如:

甲成员的初始值,指定 表达后等号 被以相同的方式处理为 分配给字段或属性。

甲成员初始化了equals后指定一个 对象初始化 符号是嵌套对象初始化, 即嵌入 对象的初始化。不是将新的 值分配给字段或属性,而是将嵌套对象 初始值设定项中的 赋值指定为字段或属性成员的赋值 。 嵌套对象初始值设定项不能为 应用于值为 类型的属性或应用于 值类型的只读字段。

甲成员初始指定一个 集合初始化的 等号是 嵌入集合的初始化之后。而不是 将新集合分配给 字段或属性,初始化程序中给定为 的元素将被添加到字段或 属性引用的集合 。