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.
@dasblinkenlight mimo, że jest powiązany, to nie jest duplikatem tego pytania, jeśli chodzi o cel. – nawfal
Zobacz także http://stackoverflow.com/questions/3797528/base-and-this-constructors-best-practices – nawfal