2013-05-31 91 views
8

我看到這個代碼塊,當我試圖用APN構建東西。有人能解釋一下,「這個」陳述在那裏做什麼?構造函數的參數後的這個聲明

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

它是否像這些參數的默認值?

+0

@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) 
{ 
} 

這使您可以調用一個構造函數可以調用另一個。

+0

這樣做有沒有任何好處,而不是有可選參數? – 2013-05-31 16:37:20

+2

@MarkusMeskanen語言不總是支持可選參數,這也允許您在兩者之間有不同的順序或省略參數。你也可以很容易地使用它來擴展構造函數(例如在上面的例子中,雙參數構造函數也可以調用this(arg1),然後爲第二個參數做一些特殊的處理)。 – poke

+0

@poke很酷,謝謝! :) – 2013-05-31 19:44:54

9

當然 - 將一個構造函數鏈接到另一個構造函數上。有兩種形式 - this鏈接到同一類中的另一個構造函數,base鏈接到基類中的另一個構造函數。你要鏈接的構造函數的主體執行,然後你的構造函數體執行。 (當然,其他構造可能鏈到一個又一個第一。)

如果不指定任何東西,它會自動鏈在基類參數的構造函數。所以:

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) { } 

編輯:

Is it like default values of those arguments ?

它的過載,你可以委託它的全部邏輯在一個地方,從構造的其餘部分與調用默認值。

this關鍵字可以在這些環境中使用:

  • 呼叫其他構造。
  • 將當前對象作爲參數傳遞。
  • 請參閱實例方法或字段。
相關問題