2013-08-02 4 views
6

私は現在クラスを持っていますが、私はそのコンストラクタとちょっと混同しています。`this`とクラスコンストラクタ

public class BarListTracker : GotTickIndicator 
{ 
    public BarListTracker(BarInterval interval) : this(new BarInterval[] { interval }) { } 
} 

this(new BarInterval[] { interval })は何を意味しますか?

+2

コンストラクタオーバーロードのためのC#構文です。 http://stackoverflow.com/a/5555741/1445661 – mao47

答えて

2

このクラスが呼び出されたときにクラスの別のコンストラクタを呼び出し、BarIntervalの配列として値を渡します。この場合、ではないは基本クラスです。それ以外の場合は: base(...)となります。これは、この非常に同じクラスで定義された別のコンストラクタです。

これは非常に一般的です。さまざまな方法でクラスにアクセスしたいからです。この場合、コード内に配列を設定せずに1つのオブジェクトしか送信できないように見えます。

はしかし、彼らが行っている可能性が一つのことだけで、他のコンストラクタ、このように: thisと呼ばれているものに変更されます。

public BarListTracker(params BarInterval[] interval) 

をし、彼らも第二のコンストラクタを必要としなかったであろう。より洗練されたソリューションで、どこでも同じ結果が得られます。

var arrOfBarInterval = new BarInterval[] { val1, val2 }; 
var tracker = new BarListTracker(arrOfBarInterval); 

しかし、あなたはまた、1つだけ渡すことができます::他のコンストラクタは、まだあなたが望んでいた場合は、配列は、あなたもそれに配列を渡すことができます取得

var tracker = new BarListTracker(barInterval); 

あなたが行う能力を持っている場合私はそれをお勧めします。

注意する必要があります。: this(...)コンストラクタが呼び出され、の前にが実行されます。ロジックを構築するときは、そのことを覚えておいてください。

+0

ありがとう助け - タイマーの後の答えとしてマーク – Rajeshwar

+0

@ Rajeshwar、私は援助の可能性があり、答えとしてマークを感謝してうれしいです!すてきな一日を! –

14

これはconstructor chainingです。基本的に、あなたはそのコンストラクタの内容を実行する前に別のコンストラクタを呼び出すことになります。

public class Foo 
{ 
    public Foo() 
     : this("Hello") 
    { 
     Console.Write(" World!"); 
    } 

    public Foo(string text) 
    { 
     Console.Write(text); 
    } 
} 

new Foo(); //outputs "Hello World!" 

だから、どこかBarListTrackerBarInterval[]配列またはこのようなIEnumerable<BarInterval>のいずれかをとり、別のコンストラクタがあるはずで:

public class BarListTracker : GotTickIndicator 
{ 
    public BarListTracker(BarInterval interval) 
     : this(new BarInterval[] { interval }) 
    { 
     //specific initialization for this constructor 
    } 

    public BarListTracker(BarInterval[] intervals) 
    { 
     //shared initialization logic for both constructors 
    } 
} 

それは身体BarListTracker(BarInterval[])を実行します、その後、の本体を実行しますBarListTracker(BarInterval)

これは、です。通常、です。コードの重複を減らすために使用されます。 BarListTrackerの初期化コードがある場合は、それを1か所に書き込んで、そのロジックをコンストラクタごとに共有するのではなく、コンストラクタごとに書き換える方が理にかなっています。

さらに、入力パラメータを基本式で渡すか変更することができます。この場合、BarListTracker(BarInterval[])コンストラクタを呼び出すとインラインで、BarInterval intervalという単一オブジェクトを配列としてラッピングしてシグネチャと一致させます。これはトラッカーを構築するためにしばしば単一のBarIntervalしか持たないプログラマーのためのより簡単なAPIを提供する便利なオーバーロードであると思われます。

4

BarListTrackerの別のコンストラクタの呼び出しで、BarIntervalの配列をとり、このコンストラクタに渡されたオブジェクトを含む配列を渡すことを意味します。

var tracker = new BarListTracker(new BarInterval[] { interval }); 
+1

あなたはとても速いです:)))! –

2

コールこのクラスの別のコンストラクタ、このような何か:それはこれに

var tracker = new BarListTracker(interval); 

同等の呼び出しを行い、彼らが基づか、または呼び出していることを示している

public BarListTracker(BarInterval[] intervals) 
1

あなたのコードで、あなたがに渡すパラメータを指定してコンストラクタを呼び出します定義されたパラメータなしのコンストラクタを使用します

var p= new Point(); 

を呼び出す場合には

public class Point{ 
    public Point(int x, int y){ 
     this.x=x; 
     this.y=y; 
    } 

    public Point():this(0,0){} 
} 

例えば、同じクラスの別のコンストラクタを呼び出します彼は0,0

これは、多くのパラメータを受け入れる複数のコンストラクタがあり、より単純な短所を提供したい場合には非常に便利ですデフォルトパラメータを持つトラクタ

0

BarIntervalの配列をパラメータとして受け取る別のコンストラクタがあります。基本的には、別のコンストラクタからコンストラクタを呼び出すことだけです。役に立つかもしれない別のリンクはCall one constructor from another

関連する問題