9

次の例を考えれば、客観的にはより良い/より速い/より安全ですか?リテラルインスタンス化をオブジェクト化するのが実用的な場合にはベストプラクティスでなければなりませんか?プロパティの設定よりもオブジェクトリテラルのインスタンス化が高速ですか?

どこが不適切ですか?

class Person 
{ 
    public string name; 
    public int age; 
} 
void MakePeople() 
{ 
    Person myPerson = new Person(); 
    myPerson.name = "Steve"; 
    myPerson.age = 21; 

    Person literalPerson = new Person { name = "John", age = 22 }; 
} 
+3

これらの2つの方法から生成されたILは同一でなければなりません。そう、いいえ。 –

+2

3行ではなく1行で、意図と効果についてより明確になります。それは10倍遅くなる可能性があり、それはまだ良い考えである。小さなパフォーマンスの違いに対する人の固定を理解することはできません(デフォルトアプローチとして、ホットスポットをマイクロ最適化するのがうれしいです)。 – delnan

答えて

16

いいえ、それは高速ではありません。同じです。

コンパイラは、オブジェクト初期化子をコンストラクタ呼び出しに変換し、その後にそれらのプロパティを設定します。

Person literalPerson = new Person { name = "John", age = 22 }; 

はターン:

Person myPerson = new Person(); 
myPerson.name = "John"; 
myPerson.age = 22; 

あなたは、より読みやすいとあなたがあなたのチームとの合意したものを使用する必要があります。

+2

+1もっと読むことができるもの(チーム環境の場合) – JYelton

+5

技術的には、コンパイラがあなたの変数atomicに代入を保持するための一時変数を宣言しているので、正確に同じではありません。 –

+0

@KirkWoll上記の場合でも 'Person'が参照型である場合にも当てはまりますか? –

0

生成されるILを調べると、それらが同一であることがわかります。オブジェクトイニシャライザの使用は、単なるコンパイラのショートカットです。

1

いずれかが適切です。プロパティを設定するために必要な作業によって異なります。例えば、私はいくつかのロジックがプロパティの値に到達する必要がある場合にリテラルインスタンス化を避けるだろう:

Person myPerson = new Person(); 
myPerson.SomeProperty = if IsNewPerson ? GetPropertyFromDatabase() : GetDefaultProperty(); 

編集:

のVisual Studioでオブジェクトリテラルの初期化を使用する1つの利点は、インテリセンスです既に宣言されていないものだけを表示してプロパティを要求します。 (私は、プロパティを設定するときに値が重複して割り当てられたコードに遭遇しました)。

+1

それはただの個人的な好みです。リテラルの初期化を使用してそれを行うこともできます。 – Servy

+0

あなたはそれを読むことはできません。 – JYelton

+0

そして読みやすさは優先事項です。私の指摘は、これは悪いことではなく、たとえあなたの例であっても、生成されたコードが同じであるということだけではありません。 – Servy

0

私はスピードがこの決定を駆動するものであるとは思わない。いずれの方法の速度にも差はほとんどありません。

私は、コードの可読性は、あなたがどのように行くかの主要な要素であるべきだと思います。その基準を使用して、私は彼らが非常に接近していると思うし、それはあなたのチームが決めたものに個人的な好みになる。しかし、私は多くのプロパティを設定する必要があるオブジェクトの場合、明示的にsetterを呼び出すことは少しわかりやすいと思います。

関連する問題