2013-08-02 12 views
7

私はコードレビューをしていると私たちの開発者の一人は、このように空のオブジェクト初期化子を使用してオブジェクトを作成している行を見つけましたよ:空のオブジェクトイニシャライザを使用する際の面違いはありますか?彼はこの方法をインスタンス化ではなく、なぜ</p> <pre><code>List<Floorplan> floorplans = new List<Floorplan> { }; </code></pre> <p>は、私にはわからない:

List<Floorplan> floorplans = new List<Floorplan>(); 

空のオブジェクトイニシャライザを使用したオブジェクトインスタンス化の欠点はありますか?文体的に矛盾している以外は、理由があるかどうかを知りたいのですが、このアプローチを避けてください。何かこれは私には匂いがすると言いますが、私は何かを言う前に確信しています。

+2

'var floorplans = new List ();'は最高のIMOです。欠点はありません。 –

+6

疑問がある場合はILを確認してください。コレクション初期化子は構文的な砂糖だけです。 –

+2

FYI - ReSharperは、デフォルトでは、空のオブジェクトイニシャライザに対して警告を発生します。 –

答えて

10

コンパイル結果は同じです。

次のC#:

static void Main() 
{ 
    var x = new List<int>(); 
    var y = new List<int> { }; 
} 

は、次のILにコンパイル:

.method private hidebysig static 
    void Main() cil managed 
{ 
    // Method begins at RVA 0x2050 
    // Code size 14 (0xe) 
    .maxstack 1 
    .entrypoint 
    .locals init (
     [0] class [mscorlib]System.Collections.Generic.List`1<int32> x, 
     [1] class [mscorlib]System.Collections.Generic.List`1<int32> y 
    ) 

    IL_0000: nop 
    IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor() 
    IL_0006: stloc.0 
    IL_0007: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor() 
    IL_000c: stloc.1 
    IL_000d: ret 
} // end of method Program::Main 

あなたがコレクションに値を追加する場合:

static void Main() 
{ 
    var x = new List<int>(); 
    x.Add(1); 
    var y = new List<int> { 1 }; 
} 

これは結果としてILあります。

.method private hidebysig static 
    void Main() cil managed 
{ 
    // Method begins at RVA 0x2050 
    // Code size 32 (0x20) 
    .maxstack 2 
    .entrypoint 
    .locals init (
     [0] class [mscorlib]System.Collections.Generic.List`1<int32> x, 
     [1] class [mscorlib]System.Collections.Generic.List`1<int32> y, 
     [2] class [mscorlib]System.Collections.Generic.List`1<int32> '<>g__initLocal0' 
    ) 

    IL_0000: nop 
    IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor() 
    IL_0006: stloc.0 
    IL_0007: ldloc.0 
    IL_0008: ldc.i4.1 
    IL_0009: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0) 
    IL_000e: nop 
    IL_000f: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor() 
    IL_0014: stloc.2 
    IL_0015: ldloc.2 
    IL_0016: ldc.i4.1 
    IL_0017: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0) 
    IL_001c: nop 
    IL_001d: ldloc.2 
    IL_001e: stloc.1 
    IL_001f: ret 
} // end of method Program::Main 

これは、コレクション初期化子がのみシンタックスシュガーであるかを示しています。コレクションの初期化子はもともとC#の一部ではなかったので、私は人がコンストラクタの構文に慣れていると思います。空のコレクションイニシャライザを使用したコードに遭遇した場合、私は自分自身に不思議に思うでしょうが、確かに重大な可読性の問題はありません。コードを理解するのに十分な知能があれば、{}()は、コードが何をしているのかを理解する能力を損なうことがありません。それは意見の問題になる。あなたのチームが同意したことを行い、それがあなただけのものなら、それをあなたの心のコンテンツに使用します。

+0

+1答えと説明。 – evanmcdonnal

1

私はそれを削除言うよう{ }初期設定が使用されなければならない理由はありません。 devは静的コレクションの初期化子を使用しています。唯一の理由は、実際には意味をなさないものがないので、いくつかのアイテムでコレクションを開始できるようにすることです。つまり、コンストラクターを正常に呼び出した場合と同様に、結果は空のコレクションになります。

+0

内部容量に違いはありませんか? – Esailija

+0

@エサリジャはその修辞学ですか?しかし、間違いなく、基本配列の長さを0にすることはできませんので、デフォルトの容量を取得すると仮定します。 – evanmcdonnal

+0

いいえ、まったく同じものであるという簡単な前提に挑戦するだけの質問です。私は本当に分かりませんでしたが、可能性がありました。 – Esailija

3

この場合、下位面はありませんが、可読性を優先します。インスタンス化中に余分なブラケットを必要としない場合は、単純で単純なものを使用しないでください。

私も賛成の生産性を言っ限り行くだろう。ここの答えの多くは、この質問に答えるために深く進んでいます。たとえ1つの手法が他の手法よりも優れていても、実際にはマイクロ最適化とは何かについて話しています。

1

彼らは基本的に同じですが、デフォルトのコンストラクタを使用すると、より読みやすいです。

0

「デフォルトコンストラクタは、より読みやすいです」と言ったコメントがたくさんあります。 (){}よりも読みやすい(またはそれ以下)と仮定する正当な理由はないので、効果的にここで投票を行っている。

あなたは正し心配している場合は、あなたの同僚のコードは大丈夫です。コーディング標準について心配している場合は、コードが標準に一致するようにコードが変更されていることを確認する必要があります。

+0

'()が()よりも(またはそれ以下の)読み込み可能であると仮定する正当な理由はありません私はそれが本当であるかどうかわかりません。C#3.0ではイニシャライザの構文がちょっと持ち込まれたことを覚えています。 '()'構文と '()'構文を使用するコードは逆順です。これは誰にとっても問題ではないかもしれませんが、選択肢が単に "世論調査"だけではない2つの理由があります – chollida

+1

" C#3.0では、この機能が6歳であることを意味します。新機能を使用しない理由は特にありません。特に –

+0

は防御的ではありません。古いバージョンをターゲットにしています。これは単なる事実です。この機能を使用すると、古いバージョンのサポートを正式に廃止したことになります。これは問題ではありませんが、開発者はそれぞれのトレードオフを認識しておく必要があります。 – chollida

関連する問題