C#: erforderlich / Sudo Null IT News

Einige Entwickler bevorzugen die Objektinitialisierung gegenüber Konstruktoren. Jemand ist empört über das erzwungene “Verschieben” von Argumenten von einem Konstruktor zum anderen während der Vererbung. Manche Leute mögen Konstrukteure als solche einfach nicht. Aber ist Leben ohne Konstrukteure möglich?

  l l

Wenn Ihnen im linken Screenshot Copy-Paste immer noch nicht höllisch vorkommt, stellen Sie sich vor, dass der Basiskonstruktor mehr Argumente hat und MyClassChild auch Erben hat, die gezwungen sind, das Parent-Copy-Paste zu erben.

Objektinitialisierung

Die einfache Lösung besteht hier nicht darin, Konstruktoren zu kopieren und einzufügen, auf Konstruktoren zu verzichten, Dienste öffentlich zu machen und Instanzen durch Objektinitialisierung (in geschweiften Klammern) zu erstellen. Das offensichtliche Problem bei diesem Ansatz ist der Verlust jeglicher Garantie, dass wir alles, was benötigt wird, exakt initialisiert haben. NullReference wartet bei jeder Initialisierung auf Sie, da eine vollständige Testabdeckung normalerweise zu teuer erscheint.

Es wird auch fragwürdig, init in Verbindung mit Nullable-Referenztypen zu verwenden. Der Punkt ist, dass wir die Garantie verlieren, dass init nicht null ist:

Aufzeichnung

Records, eingeführt in C# 9, retten teilweise die Situation, aber Sie müssen die Argumente immer noch neu anordnen, außerdem wollen Sie nicht immer die Veränderbarkeit verlieren:

Objektinitialisierung + Erforderlich

Es wird uns helfen, derzeit vorgeschlagen, ein Feature – Erforderliche Mitglieder. Member, die initialisiert werden müssen, werden mit dem Schlüsselwort new required gekennzeichnet, wodurch der Compiler überprüfen kann, ob sie initialisiert wurden:

Fehler CS9506: Erforderliches Mitglied „MyClassNew.Service1“ muss im Objektinitialisierer oder Attributkonstruktor festgelegt werden.

Der Modifikator gilt für Felder und Eigenschaften in Klassen, Strukturen und Datensätzen. „Unter der Haube“ werden Mitglieder eines Typs mit erforderlich sowie der Typ selbst mit dem Attribut gekennzeichnet [RequiredMember]. Wie Sie vielleicht erraten haben, gibt es einen Wagen und einen kleinen Wagen mit Kisten, in denen der neue Modifikator mit den vorhandenen in Konflikt steht. An der Oberfläche – ein solches Feld kann nicht für eine Zuordnung von außen unzugänglich gemacht werden ().

Gleichzeitig werden Konstrukteure, die die Initialisierung aller erforderlichen Member des Typs nicht garantieren, zwangsweise (“unter der Haube”) als unerwünscht für die Verwendung markiert. Einschließlich des Standardkonstruktors:

Fazit

Wie andere Sprachmerkmale sollte auch „required“ dort eingesetzt werden, wo es das Leben eher vereinfacht als verkompliziert, es handelt sich nicht um eine „goldene Kugel“. Ich persönlich bin ein wenig müde von nutzlosen Konstruktorimplementierungen, ich freue mich sehr auf den Moment, in dem sie herausgeschnitten werden können.

Spezifikation. Diskussion auf GitHub.

Similar Posts

Leave a Reply

Your email address will not be published.