Konstruktor vs Objekt Initialisierer Vorrang in C #
Ich habe das erlernen der Objekt-Initialisierer in C# vor kurzem, aber jetzt Frage ich mich, wie es funktioniert, wenn es Konflikte mit dem Bauherrn.
public class A
{
public bool foo { get; set; }
public A()
{
foo = true;
}
public A(bool bar)
{
foo = bar;
}
}
Was passiert, wenn ich es versuchen?
public class B
{
a = A() {foo = false};
b = A(true) {foo = false};
}
Ist ein Standard im Konstruktor ein guter Weg, um einen bool
beginnt wahr und können geändert werden?
public A(bar=true)
{
foo = bar;
}
InformationsquelleAutor der Frage bbill | 2013-06-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Dokumentation:
Dies bedeutet, dass im einfachsten Fall (so genannt Objekt-Initialisierung) es ist im Grunde die Kurzform (oder syntaktischer Zucker) für den Aufruf der Standard-Konstruktor und rufen dann die Eigenschaft setter(s). Im Fall von anonymen Typen ist diese Art der Initialisierung ist tatsächlich erforderlich und nicht nur Zucker.
Für den 2. Teil deiner Frage: Es ist mehr eine Frage von Stil, aber wenn Sie haben eine entscheidende Eigenschaft würde ich nicht erstellen Sie einen Konstruktor mit einem default-Wert. Stellen Sie den client-code legen Sie den Wert explizit fest. Ich bin mir auch nicht sicher, warum es so etwas wie dieses:
b = A(true) {foo = false};
wäre eine gute Idee, es sei denn, Sie sind in einem code-obfuscation contest.Bisschen Vorsicht aber:
InformationsquelleAutor der Antwort Paul Sasik
Objekt-Initialisierungen sind nur syntaktischer Zucker, die in Ihrer kompilierten assembly IL Sie übersetzen in separaten Anweisungen, überprüfen Sie es auf ILSpy.
InformationsquelleAutor der Antwort Tamim Al Manaseer
Dem Konstruktor erfolgt dann zunächst die Objekt-Initialisierer. Denken Sie daran, dass
ist die gleiche wie
InformationsquelleAutor der Antwort juharr
ist tatsächlich kurz für:
wo
temp
ist eine ansonsten nicht zugängliche Variablen. Der Konstruktor wird immer zuerst ausgeführt, gefolgt von initialisierten Eigenschaften.InformationsquelleAutor der Antwort Lee
Im Grunde das, was Paulus bereits verlinkt:
Aus der C# language specification 5 (7.6.10.1)
InformationsquelleAutor der Antwort Chris