2013-05-31 6 views
8

Widziałem ten blok kodu, gdy próbowałem zbudować coś z APN. Czy ktoś mógłby mi wyjaśnić, co tam robią "te" wypowiedzi?to oświadczenie po argumentach contructor

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

Czy jest to wartość domyślna tych argumentów?

+0

@dasblinkenlight mimo, że jest powiązany, to nie jest duplikatem tego pytania, jeśli chodzi o cel. – nawfal

+0

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

Odpowiedz

9

this wywołuje przeciążony konstruktor klasy ApplePushService z określonymi parametrami.

Na przykład

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

Pozwala to nazwać jeden konstruktor, który może powołać drugiego.

+0

Czy są jakieś korzyści z tego, a nie z opcjonalnych parametrów? –

+2

@MarkusMeskanen Opcjonalne parametry nie zawsze były obsługiwane przez język, a to także pozwala mieć inną kolejność lub pomijać parametry pomiędzy nimi. Możesz także łatwo użyć tego do rozwinięcia konstruktora (np. W powyższym przykładzie konstruktor z dwoma parametrami mógłby również wywołać 'this (arg1)', a następnie zrobić coś specjalnego dla drugiego parametru). – poke

+0

@poke Cool, dzięki! :) –

9

Oczywiście - ten łańcuch łączy jednego konstruktora z drugim. Istnieją dwie formy - this do połączenia z innym konstruktorem w tej samej klasie, a base do połączenia z innym konstruktorem w klasie bazowej. Ciało konstruktora, którego łańcuchy chcesz wykonać, a następnie wykonywane jest ciało konstruktora. (Oczywiście inny konstruktor może najpierw połączyć się z innym.)

Jeśli nic nie określisz, automatycznie połączy się z konstruktorem bez parametrów w klasie bazowej. Więc:

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

jest równoważna

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

Zauważ, że zmienne instancji inicjalizatory są wykonywane przed drugi konstruktor nazywa.

Niespodziewanie, C# kompilator nie wykrywa, jeśli kończy się z wzajemnej rekursji - więc ten kod jest poprawny, ale skończy się z przepełnienie stosu:

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

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

(To nie przeszkodzi łańcuchowym na jednak ten sam podpis konstruktora).

Aby uzyskać więcej informacji, zobacz my article on constructor chaining.

3

W tym przypadku wywołanie innego konstruktora, : this(...) służy do wywoływania innego konstruktora w tej klasie.

Na przykład:

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

public ClassName(string name) { } 

EDIT:

Is it like default values of those arguments ?

To przeciążenie można powierzyć to pełne logiki w jednym miejscu i połączyć się z resztą konstruktorów z wartości domyślne.

this kluczowe mogą być stosowane w tych kontekstach:

  • dzwonić do innych konstruktorów.
  • Przekazywanie bieżącego obiektu jako parametru.
  • Patrz metody lub pola instancji.
Powiązane problemy