2013-05-31 12 views
8

ho visto questo blocco di codice, quando stavo cercando di costruire qualcosa con APN. Qualcuno potrebbe spiegarmi cosa ci fa "questa" affermazione?questa dichiarazione dopo gli argomenti di contructor

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

È come i valori predefiniti di tali argomenti?

+0

@dasblinkenlight sebbene relativo, non è un duplicato di questa domanda per quanto riguarda l'intento. – nawfal

+0

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

risposta

9

this chiama il costruttore sovraccarico per la classe ApplePushService con i parametri specificati.

Per esempio

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

Questo ti permette di chiamare un costruttore in grado di richiamare un altro.

+0

Ci sono dei vantaggi nel fare questo piuttosto che avere parametri opzionali? –

+2

@MarkusMeskanen I parametri facoltativi non sono sempre supportati dalla lingua e questo consente anche di avere un ordine diverso o di omettere i parametri in mezzo. Inoltre puoi facilmente usarlo per espandere il costruttore (ad esempio nell'esempio sopra, il costruttore di due parametri potrebbe anche chiamare 'this (arg1)' e quindi fare qualcosa di speciale per il secondo parametro). – poke

+0

@poke Cool, grazie! :) –

9

Certo - che le catene un costruttore su un altro. Esistono due forme: this da associare a un altro costruttore della stessa classe e base da associare a un altro costruttore nella classe base. Il corpo del costruttore che si sta concatenando per eseguire, e quindi viene eseguito il corpo del costruttore. (Naturalmente, l'altro costruttore può catena su un altro uno prima.)

Se non si specifica nulla, catene automaticamente a un costruttore senza parametri nella classe base. Quindi:

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

è equivalente a

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

Nota quell'istanza initializers variabili vengono eseguite prima di l'altro costruttore viene chiamato.

Sorprendentemente, il compilatore C# non rileva se si finisce con mutua ricorsione - quindi questo codice è valido, ma finirà con un overflow dello stack:

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

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

(lo fa evitare che si concatenamento su la stessa firma del costruttore, tuttavia.)

Per maggiori dettagli, vedi my article on constructor chaining.

3

che chiama un altro costruttore in questo caso, il : this(...) viene utilizzato per chiamare un altro costruttore in quella classe.

Ad esempio:

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

public ClassName(string name) { } 

EDIT:

Is it like default values of those arguments ?

E 'un sovraccarico è possibile delegare è la logica pieno in un posto e chiamare dal resto dei costruttori con valori standard.

this parola chiave può essere utilizzata in questi contesti:

  • chiamata altri costruttori.
  • Passaggio dell'oggetto corrente come parametro.
  • Fare riferimento a metodi o campi di istanza.
Problemi correlati