1 2 3 4 5 6 7 8 9 10 11 12 | public class A { public A() { // ... } public A(string x = "default") { // ... } } |
Die Frage ist nun: Welcher Constructor wird verwendet, wenn ich eine Instanz mit A a = new A();
erzeuge?
Versuch 1
Im oben beschriebenen Fall kann dies schnell beantwortet werden, indem man es einfach ausprobiert:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Und hier das Resultat:
fix
Man sieht also, dass der „am besten passende“ Constructor verwendet wird und der Default-Wert keine Verwendung findet. (wenn der Standard-Constructor A()
nicht existieren würde, würde natürlich der Default-Wert verwendet).
Versuch 2
Wenn man aber mit den Access Modifiers herumspielt ist das ganze nicht mehr so eindeutig. Setzen wir einmal den Access Modifier des Standard-Constructors auf internal
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Das Ergebnis ist immer noch das selbe, hier hat der geänderte Access Modifier also noch keine Wirkung gezeigt.
Versuch 3
Versuchen wir jetzt aber mal von Aussen zuzugreifen:
1 2 3 4 5 6 7 8 9 10 11 |
Dieser Code muss mit einer Referenz auf den compilierten Code aus dem zweiten Beispiel enthalten. Dies erfolgt beim Command Line Tool csc
mit dem Parameter /r=<filename>
.
Das Resultat sieht nun anders aus:
fix
Es wird jetzt also der Constructor mit dem Default-Wert aufgerufen, da der Standard-Constructor von der Dritt-Assembly nicht aufgerufen werden darf.
Fazit
Wann welcher Constructor verwendet wird ist nicht nur von den Parametern sondern auch von den Access Modifiern und dem Kontext abhängig.