我喜欢C#3 initializer syntax并且使用它很多,但今天在查看Reflector时,出现了以下内容:
var binding = new WSHttpBinding
{
ReaderQuotas = { MaxArrayLength = 100000 },
MaxReceivedMessageSize = 10485760
};
起初我认为这是一个错误,但它确实编译了!我猜我一直都在学习新东西。 :)
据我所知,它设置了MaxArrayLength
的{{1}}属性的ReaderQuotas
属性。
这种语法是否会创建一个新的WSHttpBinding
对象,然后设置该属性,还是假设该属性已经初始化?这是用于初始化“子”属性的一般方法吗?
我发现语法有点令人困惑......
答案 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的成员初始值设定项 之后的集合初始化程序 等号是一个初始化的 嵌入式集合。代替 将新集合分配给 领域或财产,给出的要素 在初始化程序中添加到 字段引用的集合或 属性。