私は最近これらの 2 つのことを見て、少し混乱しています。
var blah = new MyClass() { Name = "hello" }
と
var blah = new MyClass { Name = "hello" }
違いは何ですか?なぜ両方が機能するのですか?
更新: これは、コンストラクターに何か計算を行うものがある場合、最初のものを呼び出さなければならないということですか??
私は最近これらの 2 つのことを見て、少し混乱しています。
var blah = new MyClass() { Name = "hello" }
と
var blah = new MyClass { Name = "hello" }
違いは何ですか?なぜ両方が機能するのですか?
更新: これは、コンストラクターに何か計算を行うものがある場合、最初のものを呼び出さなければならないということですか??
私の知る限り、それらはまったく同等です。C# 仕様 (または少なくとも Microsoft の実装) では、中かっこ (つまり、オブジェクト初期化子の構文) を使用している限り、既定のコンストラクター (パラメーターなし) を使用するときに () を省略できます。ここでは、オブジェクト初期化子はコンストラクターに違いをもたらさないことに注意してください。new MyClass
ビットは、デフォルトのコンストラクターへの呼び出しとして個別に解釈されます。個人的には、一貫性を保つために常に丸括弧 () を含めることをお勧めします。オブジェクト初期化子が後に続く場合に必要です。
違いはありません。最初のフォームは、コンストラクターも呼び出していることを示しているだけです。
class Ö {
public string Ä { get; set; }
public string Å { get; set; }
public Ö() { Å = "dear";}
public Ö(string å) { Å = å; }
}
Console.WriteLine(new Ö { Ä = "hello" }.Å);
Console.WriteLine(new Ö("world") { Ä = "hello" }.Å);
結果は次のとおりです。
dear
world
上記のコメントに追加するには、エクストラを追加すると、どのコンストラクターまたは init メソッドが呼び出されているかを明確にするのに役立ちます。確かにスタイリング面も……。
一部のユーザーはコンストラクターを呼び出すための () の明確さを好むため、オブジェクト初期化子の () 形式を保持していると思いますが、iirc、C++ (または最初のバージョン) では、括弧なしでコンストラクターを呼び出すことができます。私の 2 番目の推測では、彼ら (言語設計者) は C# に JSON のような構造を持たせることに傾倒しているので、() なしでコンストラクターを呼び出すのが容易になります。私は2番目の形式を好みます。
VB.NET のプロパティ (非常に悪いですが) で変数を 2 つの形式で割り当てることができるように、違いはありません: button1.Height = 100 button1.Height() = 1000
実際には、デフォルトの空のコンストラクターを持たないタイプを処理するまで、大きな違いはありません。そのような場合、「new SomeClass(MandatoryArgument) { Prop1 = 1, Prop2 = 2 }」のように書くと利益が得られます。