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 };
}
4

4 に答える 4

16

いいえ、速くも遅くもありません。同じです。

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

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

次のようになります。

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

より読みやすく、チームと合意した内容を使用する必要があります。

于 2012-08-15T19:31:45.540 に答える
1

どちらかが適切です。プロパティを設定するために何をする必要があるかによって異なります。たとえば、プロパティ値に到達するために何らかのロジックが必要な場合は、文字通りのインスタンス化を避けます。

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

編集:

Visual Studioでリテラルオブジェクトの初期化を使用する利点の1つは、Intellisenseがプロパティの入力を求め、まだ宣言されていないプロパティのみを表示することです。(プロパティを設定するときに値が冗長に割り当てられているコードに遭遇しました。)

于 2012-08-15T19:33:26.680 に答える
0

生成されたILを見ると、それらが同一であることがわかると確信しています。オブジェクト初期化子の使用は、単なるコンパイラのショートカットです。

于 2012-08-15T19:32:18.957 に答える
0

速度がこの決定の原動力であってはならないと思います。どちらの方法の速度にもおそらくほとんど違いはありません。

コードの可読性は、どの方向に進むかの主要な要因であるべきだと思います。その基準を使用すると、それらは非常に近いと思います。それは、個人の好みやチームが決定するものに帰着します. ただし、多くのプロパティを設定する必要があるオブジェクトの場合、セッターを明示的に呼び出すと、もう少し読みやすくなると思います。

于 2012-08-15T19:34:34.223 に答える