31

私は C# 3 の初期化構文が好きでよく使っていますが、今日、Reflector を調べていると、次のことがわかりました。

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

最初は間違いかと思いましたが、コンパイルできました!私はまだ新しいことを常に学んでいると思います。:)

私が知る限り、MaxArrayLengthのプロパティのプロパティをReaderQuotas設定します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 に答える