2013-05-31 23 views
8

私はAPNで何かをビルドしようとしていたときにこのコードブロックを見ました。誰かが "この"声明が何をしているのかを私に説明することができますか?コンストラクタの引数の後のこのステートメント

public ApplePushService(IPushChannelFactory pushChannelFactory, ApplePushChannelSettings channelSettings) 
     : this(pushChannelFactory, channelSettings, default(IPushServiceSettings)) 

これらの引数のデフォルト値に似ていますか?

+0

@dasblinkenlight @ dasblinkenlight関連性はありますが、この質問と重複しているわけではありません。 – nawfal

+0

http://stackoverflow.com/questions/3797528/base-and-this-constructors-best-practices – nawfal

答えて

9

thisは、指定されたパラメータを使用してApplePushServiceクラスのオーバーロードされたコンストラクタを呼び出します。例えば

// Set a default value for arg2 without having to call that constructor 
public class A(int arg1) : this(arg1, 1) 
{ 
} 

public class A(int arg1, int arg2) 
{ 
} 

これはあなたが別のを呼び出すことができる1つのコンストラクタを呼び出すことができます。

+0

オプションパラメータを使用するのではなく、これを行うメリットはありますか? –

+2

@MarkusMeskanen言語では省略可能なパラメータが常にサポートされているとは限りません。また、これによって、異なる順序を持つことや、間にパラメータを省略することもできます。また、これを使用してコンストラクタを簡単に拡張することもできます(例えば、上の例では、2パラメータコンストラクタは 'this(arg1) 'を呼び出してから第2パラメータに対して特別なことを行うこともできます)。 – poke

+0

@pokeクール、ありがとう! :) –

9

確かに、1つのコンストラクタを別のコンストラクタに連結します。同じクラスの別のコンストラクタに連結するthisと、基本クラスの別のコンストラクタに連結するbaseの2つの形式があります。連鎖しているコンストラクタの本体が実行され、コンストラクタ本体が実行されます。 (もちろん、別のコンストラクタが別のコンストラクタに連結されている可能性があります。)

何も指定しなければ、自動的に基本クラスのパラメータのないコンストラクタにチェーンされます。だから、:

public Foo(int x) 
{ 
    // Presumably use x here 
} 

インスタンス変数初期化子は、他のコンストラクタが呼び出される前を実行していることを

public Foo(int x) : base() 
{ 
    // Presumably use x here 
} 

ノートと同等です。

驚くべきことに、あなたは相互再帰で終わる場合C#コンパイラは検出されません - ので、このコードは有効ですが、スタックオーバーフローで終わるだろう:

public class Broken 
{ 
    public Broken() : this("Whoops") 
    { 
    } 

    public Broken(string error) : this() 
    { 
    } 
} 

(それはあなたが上に連鎖を防ぐんしかし、全く同じコンストラクタシグネチャ)。

詳細については、my article on constructor chainingを参照してください。

3

この場合、別のコンストラクタを呼び出すと、: this(...)がそのクラスの別のコンストラクタを呼び出すために使用されます。例えば

public ClassName() : this("abc") { } 

public ClassName(string name) { } 

EDIT:

Is it like default values of those arguments ?

それが過負荷あなたはそれが一つの場所にフルロジックのデリゲートおよびコンストラクタの残りの部分とから呼び出すことができますデフォルト値。

thisキーワードは、これらのコンテキストで使用することができます:

  • は他のコンストラクタを呼び出します。
  • 現在のオブジェクトをパラメータとして渡します。
  • インスタンスメソッドまたはフィールドを参照してください。
関連する問題