2009-03-21 9 views
3

最近私はこれらの2つのことを見てきました。私はちょっと混乱しています。丸いかっこですか?違いはなんですか?

var blah = new MyClass() { Name = "hello" } 

var blah = new MyClass { Name = "hello" } 

いただきまし違いは?なぜ彼らは両方の仕事をしていますか?

更新: これは、私が最初のものを呼び出す必要があるいくつかの計算を行うコンストラクタに何かを持っているということですか?

答えて

15

私が知る限り、それらはまったく同等です。中括弧(つまり、object initialisersの構文)を使用している限り、C#仕様(または少なくともMicrosoftの実装)では、デフォルトコンストラクタ(パラメータなし)を使用するときに、()を省略できます。オブジェクト初期化子はここでコンストラクタと何の違いもないことに注意してください。new MyClassビットは、引き続きデフォルトコンストラクタの呼び出しとして別々に解釈されます。個人的には、一貫性のために丸括弧()をつけておくことをお勧めします。には、オブジェクトイニシャライザがない場合にはが必要です。

+0

+1 。 ここにリンクがあります。http://weblogs.asp.net/dwahlin/archive/2007/09/09/c-3-0-features-object-initializers.aspx –

3

差は最初の形式はちょうどあなたもコンストラクタを呼び出していることを指摘し、ありません:、上記のコメントに追加するには

dear 
world 
+1

私はちょうどイケアのフラッシュバックがありました。 –

1

追加:

class Ö { 
    public string Ä { get; set; } 
    public string Å { get; set; } 
    public Ö() { Å = "dear";} 
    public Ö(string å) { Å = å; }  
} 

Console.WriteLine(new Ö { Ä = "hello" }.Å); 
Console.WriteLine(new Ö("world") { Ä = "hello" }.Å); 

はになりますextraは、どのコンストラクタまたはinitメソッドが呼び出されているかを明確にするのに役立ちます。また、スタイリングの面でも...

1

コンストラクタを呼び出す明快さ(i)、iirc、C++(または最初のバージョン)のようなユーザが呼び出すことができるので、オブジェクトイニシャライザの()かっこなしのコンストラクタです。私の2番目の推測では、(言語デザイナー)C#にJSONのような構造を持たせるように傾けています。これはちょっときちんとしているので、()を使わないでコンストラクターを呼び出すことができます。私は第二の形態を好む。

VB.NETのプロパティと同じように、変数は2つの形式で割り当てることができます。button1.Height = 100 button1.Height()= 1000 Kinda lame 。

1

実際には、デフォルトの空のコンストラクタを持たない型を扱うまで、大きな違いはありません。このような場合、これはC#3.0で新しく追加された "オブジェクト初期化"機能であると言われたので、 "新しいSomeClass(MandatoryArgument){Prop1 = 1、Prop2 = 2}"のような文章を書くことができます。

関連する問題