{}でオブジェクトパラメータを作成しますか?


14

私は本からコードをデコードしようとしています:

List<Person> people = new List<Person>()
{
new Person {FirstName="Homer",LastName="Simpson",Age=47},
new Person {FirstName="Marge",LastName="Simpson",Age=45}
};

Personは、作成した単純なクラスであり、名前、姓などのフィールドがあります。

私が理解していないのは、中括弧ではないパラメーターをPersonのコンストラクターに送信しないかということです。私はこのコードを複製しようとしましたが、飛べないようです。

入力いただきありがとうございます。



1
「このコードを複製しようとしましたが、飛んでいないようです」<-この構文を使用するには、C#3(VS 2008)以降を使用する必要があります。
AakashM

オブジェクトの初期化とオブジェクトの投入という2つの概念の違いに注意してください。一般に、コンストラクターで初期化を行います。この例のメソッドは、初期化ではなく、ポピュレーションに最適です。
NoChance

回答:


27

C#では、オブジェクトが初期化されるときにプロパティパラメータを中括弧で指定できます。これにより、初期化するアイテムとデフォルトのままにするアイテムを選択できます。

一方、コンストラクターは、パラメーターの固定セットを使用して1つのコードブロックを実行します。したがって、同じ効果を得るには、初期化するプロパティのさまざまな組み合わせを使用して複数のコンストラクターを作成する必要がありますが、これは面倒な場合があります。

var x = new Person {FirstName="Homer",LastName="Simpson",Age=47}; 

これとまったく同じです:

var x = new Person();
x.FirstName="Homer";
x.LastName="Simpson";
x.Age=47;

目が短く、間違いなく簡単であることを除いて。

また、質問で示したような構造体も使用できます。一時変数を作成し、リストに追加する前にここで行ったように初期化する必要がある場合は非常に退屈です。(これは以前の方法です。)すべて、必要なパラメーターのリストを取得する明示的に定義されたコンストラクターを必要とせず、使用可能または使用不可の場合があります。

また、コンストラクターはプライベートセッターでプロパティを初期化できますが、この手法(提供された例から明らかなように)は、プロパティのパブリックセッターがある場合にのみ機能することに注意してください。また、短縮された例では、暗黙的にデフォルト(パラメーターなし)コンストラクターが呼び出されるため、このコンストラクターが存在する必要があることに注意してください。


このため、中括弧で初期化されたプロパティはパブリックに設定可能でなければならないことを追加する価値があるかもしれません。
ヤムマルコビッチ

@YamMarcovicああ。はい。その効果に追加されたメモ。
タイラー

2
ああ、私は啓発された、素晴らしい説明です。
RealityDysfunction

2
単一のコンストラクターで非常に似た効果を得るには、そのパラメーターをすべてオプションにすることができます。次に、あなたのような何かを行うことができnew Person(lastName: "Simpson")除外、firstNameおよびageパラメータを。
svick

これはあなただけつまり、コンストラクタにそれらを渡すことができない理由は対処しないvar x = new Person("Homer", "Simpson", 47);
rayray
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.