10

newコンストラクターとnewメンバー宣言の違いは何ですか?

public class PspGame {

  private List<string>name = new List<string>();
  private List<string>_value;

  public PspGame() {
    _value = new List<string>();
  }
}

それを行うための最良の方法は何ですか?パフォーマンスの問題はありますか?

4

5 に答える 5

11

それらはほとんど同等です(パフォーマンスとメモリ使用量の違いはごくわずかです)。唯一の本当の違いは、次のことを行う場合です。

private List<string>name = new List<string>();

...オブジェクトのインスタンスを作成するためにどのコンストラクターが使用されても、割り当ては常に発生します。コンストラクター内で割り当てを行う場合、その特定のコンストラクターが使用されている場合にのみ発生します。

したがって、複数のコンストラクターがあり、常にnameまったく同じ方法で初期化する場合は、各コンストラクターで明示的に初期化するよりも、最初の形式を使用する方が少し短くなります。

ただし、原則として、場合によってはコードがより冗長になる場合でも、コンストラクターの実装でフィールドを初期化することをお勧めします。

于 2012-05-13T23:31:38.667 に答える
4

私にとって、コンストラクター(デフォルト以外のコンストラクター)に引数があると、より良いテストが可能になります。メンバーをパブリック(または少なくとも内部)にするか、「setter」プロパティを使用して2回目の呼び出しを行わないと、必ずしも実行できない特定のデータをメンバーフィールドに「注入」できます。

複数のコンストラクターを持つことができるので、本当に必要な場合は、デフォルトのコンストラクターと組み合わせて、テスト用に2番目のコンストラクターを持つことができます。

後でデータを入力するために別の呼び出しを行う必要があるか、クラスへの複数の呼び出し(1つはオブジェクトを作成し、2つ目はメンバーを入力する)を含む保守性の低いコードを使用する以外に、実際のパフォーマンスの問題はありません。

編集:私はちょっと間違った質問に答えたことに気づきました。彼はデフォルトと非デフォルトのコンストラクターの違いについて質問していると思いました。これで、コンストラクターとメンバー宣言のメンバーを初期化するデフォルトのコンストラクターに関するものであることがわかりました...

于 2012-05-13T23:29:38.073 に答える
1

2つは同等です。コンパイラーは、そのようなメンバーの初期化をコンストラクター(メンバーが静的な場合は静的コンストラクター)に移動します。私はそれを行うための一般的な最善の方法があるとは言いません-可能な限り一貫性を保ち、状況でより理にかなっている場合はそれを使用してください。

于 2012-05-13T23:30:30.283 に答える
1

コンストラクターでインスタンスメンバーを初期化し、宣言でクラスメンバーを初期化します。これは(唯一の)慣例であり、パフォーマンスの低下はありません。私見では、これは言語規則(構文/意味論)に強制されるべきです。

于 2012-05-13T23:30:49.087 に答える
1

コンストラクターでフィールドを初期化すると、この問題を回避することもできます。

class MyClass
{
    private List<string> _list = new List<string>();
    public MyClass()
    {
        //some logic here
    }
    public MyClass(List<string> initialList) : this()
    {
        _list = initialList;
    }
}

このコードでは、2 番目のコンストラクターを呼び出すと、不要なリストが作成されます。リストはすぐに破棄され、ガベージ コレクションの対象になります。

于 2012-05-14T03:14:20.743 に答える