2009-07-30 14 views
2

可能性の重複:
Best Practice: Initialize class fields in constructor or at declaration?メンバ変数を初期化するためのベストプラクティス?

私はC#ので働いていますが、これはおそらく、Javaの(または同様、この動作を可能にする任意の他の言語)に適用されます...

方法好ましい/ベストプラクティスですか? OR - - 私はいつも_memberVar

1.

class MyClass 
{ 
    private Dictionary<int, string> _memberVar = new Dictionary<int, string>(); 

    public MyClass() {} 
} 

必要になりますと仮定し

2.

class MyClass 
{ 
    private Dictionary<int, string> _memberVar = null 

    public MyClass() 
    { 
     _memberVar = new Dictionary<int, string>(); 
    } 
} 

今すぐMyClassが上向きの10のコンストラクタを持っていることを言うことができます...ですから、私は_memberVar = new Dictionary<int, string>();をこれらのコンストラクタのすべてに入れたくはありません。第1の方法に何か問題はありますか?おかげ

編集: 私はコンストラクタをチェーンすることができます実現が、これはかなり複雑なクラスです...いくつかのコンストラクタがベースを呼び出し、いくつかのコール他のコンストラクタすでになどなど

+0

http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at-declaration – M4N

+0

と重複しています... – Polaris878

答えて

2

メンバ変数を初期化する必要はありませんが、メンバ変数を初期化する必要はありません。メンバ変数はデフォルト値を自動的に取得します。通常はオブジェクトの場合はnull、プリミティブ型の場合は0intの場合)の既定値が自動的に取得されます。

異なるコンストラクタを使用する場合は、オーバーロードされたメソッドと同じようにオーバーロードされたコンストラクタを呼び出すことができるため、各バージョンでメンバの初期化を繰り返す必要はありません。

ベストプラクティスについて個人的に私はオブジェクトを安定した状態に「構築」したいので、コンストラクタのメンバ変数を初期化します。言い換えれば、私が宣言したところでメンバー変数を初期化しても、コンストラクタが呼び出されると、スレートをきれいに拭き取っているかのようになります。

0

理想的には、あなたがすべきこのために依存性注入を使用してください。つまり、それをクラスのインスタンス作成者に任せて、依存関係の新しいインスタンスを作成し、クラスが依存関係自体を作成するのではなく、クラスの新しいインスタンスに挿入することを意味します。

+0

このコードはプロバイダー... soooo yeah haha​​ – Polaris878

+0

私は塩の穀物でこのアドバイスをとるだろう。この日、そして時代、人々はあらゆる問題で「依存性注入」を投げますが、最終的にはいくつかのオブジェクトが他のオブジェクトをインスタンス化する責任があります。あなたの例では、メンバ変数は 'Dictionary'なので、それはオブジェクトグラフの終わりにあるリーフオブジェクトであると仮定します。この場合、現在のオブジェクトはそれを作成する責任があります。 –

0

最初の方法は私が一般的に行う方法であり、すべてのコンストラクタが同じ値に初期化する場合は完全に許容されます。静的なコンストラクタの明示的な宣言を避けるためにも、静的な変数に対してもそれを好むでしょう。

1

_memberVarに関しては、10個のコンストラクタで初期化されています。クラスを再考する必要があると思います。それは過度に聞こえる。各コンストラクタで同じ作業を行っている場合は、DRYに違反しています。代わりに、この構造を採用しよう:

public class MyClass { 
    Foo _foo; 
    Bar _bar; 
    Baz _baz; 

    public MyClass(Foo foo, Bar bar, Baz baz) { 
     _foo = foo; _bar = bar; _baz = baz; 
    } 

    public MyClass(Foo foo, Bar bar) : this(foo, bar, new Baz()) { } 

    public MyClass(Foo foo) : this(foo, new Bar()) { } 

    public MyClass() : this(new Foo()) { } 
} 

注、私は意図的に、残りの各における最も広いコンストラクタへないコールをしましたが、ケースに変更デフォルトの感覚を振る舞いを継承するように代わりにカスケード接続することをそれぞれについて。

宣言時のメンバ初期化に関して、メンバがコンストラクタへの引数の1つを使用して構築されていない場合、宣言で初期化することをお勧めします。

関連する問題