Konstruktorentwurf

Hinweis

Diese Inhalte wurden mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines nachgedruckt: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Diese Ausgabe wurde 2008 veröffentlicht, und das Buch wurde seitdem in der dritten Ausgabe vollständig überarbeitet. Einige der Informationen auf dieser Seite sind möglicherweise veraltet.

Es gibt zwei Arten von Konstruktoren: Typkonstruktoren und Instanzkonstruktoren.

Typkonstruktoren sind statisch und werden von der CLR ausgeführt, bevor der Typ verwendet wird. Instanzkonstruktoren werden ausgeführt, wenn eine Instanz eines Typs erstellt wird.

Typkonstruktoren können keine Parameter annehmen. Instanzkonstruktoren können Parameter annehmen. Instanzkonstruktoren, die keine Parameter annehmen, werden häufig als parameterlose Konstruktoren bezeichnet.

Konstruktoren sind die natürlichste Möglichkeit, Instanzen eines Typs zu erstellen. Die meisten Entwickler versuchen, einen Konstruktor zu verwenden, bevor sie alternative Möglichkeiten zum Erstellen von Instanzen (z. B. Factorymethoden) in Betracht ziehen.

✔️ ERWÄGEN Sie die Bereitstellung einfacher (idealerweise standardmäßiger) Konstruktoren.

Ein einfacher Konstruktor verfügt über eine sehr kleine Anzahl von Parametern, und alle Parameter sind Primitive oder Enumerationen. Solche einfachen Konstruktoren erhöhen die Verwendbarkeit des Frameworks.

✔️ ERWÄGEN Sie die Verwendung einer statischen Factorymethode anstelle eines Konstruktors, wenn die Semantik des gewünschten Vorgangs nicht direkt auf die Konstruktion einer neuen Instanz abgebildet werden kann oder wenn es sich unnatürlich anfühlt, den Entwurfsrichtlinien für Konstruktoren zu befolgen.

✔️ VERWENDEN Sie Konstruktorparameter als Abkürzungen zum Festlegen von Haupteigenschaften.

Es sollte keinen Unterschied in der Semantik zwischen der Verwendung des leeren Konstruktors gefolgt von einigen Eigenschaftssätzen und der Verwendung eines Konstruktors mit mehreren Argumenten geben.

✔️ VERWENDEN Sie den gleichen Namen für Konstruktorparameter und eine Eigenschaft, wenn die Konstruktorparameter einfach zum Festlegen der-Eigenschaft verwendet werden.

Der einzige Unterschied zwischen solchen Parametern und den Eigenschaften sollte die Groß-/Kleinschreibung sein.

✔️ FÜHREN Sie im Konstruktor so wenige Aufgaben wie möglich aus.

Konstruktoren sollten neben der Erfassung der Konstruktorparameter nicht viele Aufgaben übernehmen. Die Kosten für andere Verarbeitung sollten zurückgestellt werden, bis sie erforderlich sind.

✔️ LÖSEN Sie ggf. Ausnahmen von Instanzkonstruktoren aus.

✔️ DEKLARIEREN Sie den öffentlichen parameterlosen Konstruktor explizit in Klassen, wenn ein solcher Konstruktor erforderlich ist.

Wenn Sie nicht explizit Konstruktoren für einen Typ deklarieren, fügen viele Sprachen (z. B. C#) automatisch einen öffentlichen parameterlosen Konstruktor hinzu. (Abstrakte Klassen erhalten einen geschützten Konstruktor.)

Durch das Hinzufügen eines parametrisierten Konstruktors zu einer Klasse wird verhindert, dass der Compiler den parameterlosen Konstruktor hinzufügt. Dies verursacht häufig versehentlich Breaking Changes.

❌ VERMEIDEN Sie das explizite Definieren von parameterlosen Konstruktoren für Strukturen.

Dadurch wird die Arrayerstellung beschleunigt, denn wenn der parameterlose Konstruktor nicht definiert ist, muss er nicht für jeden Slot im Array ausgeführt werden. Beachten Sie, dass viele Compiler (einschließlich C#) aus diesem Grund nicht erlauben, dass Strukturen parameterlose Konstruktoren aufweisen.

❌ VERMEIDEN Sie das Aufrufen von virtuellen Membern für ein Objekt innerhalb seines Konstruktors.

Das Aufrufen eines virtuellen Members bewirkt, dass die am meisten abgeleitete Außerkraftsetzung selbst dann aufgerufen wird, wenn der Konstruktor des am meisten abgeleiteten Typs noch nicht vollständig ausgeführt wurde.

Typkonstruktorrichtlinien

✔️ LEGEN Sie statische Konstruktoren als privat FEST.

Ein statischer Konstruktor, der auch als Klassenkonstruktor bezeichnet wird, wird verwendet, um einen Typ zu initialisieren. Die CLR ruft den statischen Konstruktor auf, bevor die erste Instanz des Typs erstellt wird bzw. bevor statische Member für den Typ aufgerufen werden. Der Benutzer hat keine Kontrolle darüber, wann der statische Konstruktor aufgerufen wird. Wenn ein statischer Konstruktor nicht privat ist, kann er von anderem Code als der CLR aufgerufen werden. Abhängig von den Vorgängen, die im Konstruktor ausgeführt werden, kann dies zu unerwartetem Verhalten führen. Der C#-Compiler erzwingt, dass statische Konstruktoren privat sind.

❌ Lösen Sie KEINE Ausnahmen aus statischen Konstruktoren aus.

Wenn von einem Typkonstruktor eine Ausnahme ausgelöst wird, kann der Typ in der aktuellen Anwendungsdomäne nicht verwendet werden.

✔️ ERWÄGEN Sie die Inlineinitialisierung statischer Felder anstelle der expliziten Verwendung statischer Konstruktoren, weil die Laufzeit die Leistung von Typen optimieren kann, die über keinen explizit definierten statischen Konstruktor verfügen.

Teile ©2005, 2009 Microsoft Corporation. Alle Rechte vorbehalten.

Nachdruck mit Genehmigung von Pearson Education, Inc aus Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition von Krzysztof Cwalina und Brad Abrams, veröffentlicht am 22. Oktober 2008 durch Addison-Wesley Professional als Teil der Microsoft Windows Development Series.

Weitere Informationen