31

我喜欢 C# 3初始化器语法并经常使用它,但是今天在查看 Reflector 时,出现了以下问题:

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

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

据我所知,它设置MaxArrayLengthReaderQuotas.WSHttpBinding

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

我确实发现语法有点混乱......

4

2 回答 2

23

不,除非您使用,否则不会创建新对象= new SomeType {...}

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

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

您的代码大致相当于:

var binding = new WSHttpBinding();
binding.ReaderQuotas.MaxArrayLength = 100000;
binding.MaxReceivedMessageSize = 10485760;
于 2010-01-07T12:18:36.033 回答
15

这有点令人困惑,我同意。

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

在等号之后指定表达式的成员初始值设定项的处理方式与对字段或属性的赋值相同。

在等号之后指定对象初始化器的成员初始化器是嵌套对象初始化器,即嵌入对象的初始化。嵌套对象初始值设定项中的赋值不是为字段或属性分配新值,而是被视为对字段或属性成员的赋值。嵌套对象初始值设定项不能应用于具有值类型的属性或具有值类型的只读字段。

在等号之后指定集合初始值设定项的成员初始值设定项是嵌入式集合的初始化。初始化器中给出的元素被添加到字段或属性引用的集合中,而不是为字段或属性分配新集合。

于 2010-01-07T18:18:19.730 回答