25

これは非常に愚かで初歩的な質問のようですが、ググってみましたが、満足のいく答えが見つかりませんでした。

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Person(){}
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}

私の質問は、このようなクラスがある場合、オブジェクトを作成する最良の方法は何ですか?

Person p=new Person("abc",15)

また

Person p=new Person();
p.Name="abc";
p.Age=15;

これら 2 つの方法の違いと、オブジェクトを作成する最良の方法は何ですか?

4

8 に答える 8

36

不変オブジェクトが必要かどうかを決定します。

クラスにプロパティを配置publicすると、すべてのインスタンスの状態をコード内でいつでも変更できます。したがって、クラスは次のようになります。

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Person(){}
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}

その場合、Person(string name, int age)コンストラクタを持つことはあまり役に立ちません。

2 番目のオプションは、不変型を実装することです。例えば:

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}

これで、作成時にインスタンスの状態をonceに設定するコンストラクターができました。プロパティのセッターはprivateであるため、オブジェクトがインスタンス化された後に状態を変更できないことに注意してください。

ベスト プラクティスは、可能であれば毎回クラスを不変として定義することです。不変クラスの利点を理解するには、この記事を読むことをお勧めします。

于 2013-02-07T17:24:24.253 に答える
11

最近、少なくとも1つのベアコンストラクターが定義されているクラスの傾向が見られますが、実際には要件によって異なります。

コンストラクターを介してパラメーターを投稿することの利点は、インスタンス化後にこれらの値を信頼できることを知っていることです。欠点は、ベアコンストラクターでオブジェクトを作成できることを期待するライブラリーでより多くの作業を行う必要があることです。

私の個人的な好みは、ベアコンストラクターを使用して、宣言の一部としてプロパティを設定することです。

Person p=new Person()
{
   Name = "Han Solo",
   Age = 39
};

これにより、「クラスにベアコンストラクターがない」という問題が回避され、メンテナンスが削減されます(コンストラクターを変更せずにさらに多くの設定を行うことができます)。

于 2013-02-07T09:02:53.790 に答える
6

私の謙虚な意見では、これは引数がオプションかどうかを決定するだけの問題です。Person オブジェクトが Name と Age なしでは (論理的に) 存在してはならない場合は、コンストラクターでそれらを必須にする必要があります。それらがオプションの場合 (つまり、それらがなくてもオブジェクトの適切な機能に対する脅威ではない)、setter を使用します。

以下は、コンストラクター注入に関する Symfony のドキュメントからの引用です。

コンストラクター インジェクションを使用することには、いくつかの利点があります。

  • 依存関係が要件であり、それなしではクラスが機能しない場合は、コンストラクターを介してそれを注入することで、それなしではクラスを構築できないため、クラスが使用されるときに存在することが保証されます。
  • コンストラクターは、オブジェクトの作成時に一度だけ呼び出されるため、オブジェクトの存続期間中に依存関係が変更されないことを確認できます。

これらの利点は、コンストラクター注入がオプションの依存関係を操作するのに適していないことを意味します。クラス階層と組み合わせて使用​​することもより困難です。クラスがコンストラクター注入を使用する場合、それを拡張してコンストラクターをオーバーライドすると問題が発生します。

(Symfony は、最も人気があり尊敬されている php フレームワークの 1 つです)

于 2013-02-07T11:31:54.110 に答える
6

本当に最善の方法はありません。初期化中にコンストラクターに渡されたパラメーターを使用して追加の処理を行いたい場合や、コンストラクターを呼び出した直後に一貫した状態を確保したい場合を除き、どちらもまったく同じです。その場合は、前者を優先してください。

ただし、読みやすさ/保守性の理由から、パラメーターが多すぎるコンストラクターの作成は避けてください。

この場合は、どちらでもかまいません。

于 2013-02-07T08:59:29.813 に答える
4

コードが少ないほど効率が良いと思う場合は、構成関数を使用することをお勧めします。次のようなコードを使用することもできます。

Person p=new Person(){
Name='abc',
Age=15
}
于 2013-02-07T09:04:04.970 に答える