Freigeben über


Konstruktorentwurf

Hinweis

Dieser Inhalt wird mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines: Konventionen, Idiome und Muster für wiederverwendbare .NET-Bibliotheken, 2. Auflage nachgedruckt. 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 vom CLR ausgeführt, bevor der Typ verwendet wird. Instanzkonstruktoren werden ausgeführt, wenn eine Instanz eines Typs erstellt wird.

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

Konstruktoren sind die natürlichste Methode zum Erstellen von Instanzen eines Typs. Die meisten Entwickler suchen und versuchen, einen Konstruktor zu verwenden, bevor sie alternative Methoden zum Erstellen von Instanzen (z. B. Factorymethoden) in Betracht ziehen.

✔️ ERWÄGEN SIE, einfache, idealerweise standardmäßige Konstruktoren bereitzustellen.

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

✔️ ERWÄGEN SIE die Verwendung einer statischen Factory-Methode anstelle eines Konstruktors, wenn die Semantik des gewünschten Vorgangs nicht direkt der Konstruktion einer neuen Instanz zugeordnet wird oder wenn die Einhaltung der Konstruktorrichtlinien unnatürlich erscheint.

✔️ DO verwenden Konstruktorparameter als Kurzbefehle zum Festlegen der Haupteigenschaften.

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

✔️ Verwenden Sie denselben Namen für Konstruktorparameter und eine Eigenschaft, wenn die Konstruktorparameter verwendet werden, um die Eigenschaft einfach festzulegen.

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 nicht viel tun, außer die Konstruktorparameter zu erfassen. Die Kosten anderer Verarbeitungen sollten so lange verzögert werden, bis dies erforderlich ist.

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

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

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

Durch 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 die explizite Definition von parameterlosen Konstruktoren für Strukturen.

Dies macht die Erstellung von Arrays schneller, denn wenn der parameterlose Konstruktor nicht definiert ist, muss er nicht auf jedem Steckplatz im Array ausgeführt werden. Beachten Sie, dass viele Compiler, einschließlich C#, aus diesem Grund keine Konstruktoren ohne Parameter zulassen.

❌ VERMEIDEN Sie das Aufrufen virtueller Member für ein Objekt innerhalb des 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 oder alle statischen Elemente für diesen 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 eine Ausnahme von einem Typkonstruktor ausgelöst wird, kann der Typ nicht in der aktuellen Anwendungsdomäne verwendet werden.

✔️ ERWÄGEN Sie, statische Felder inline zu initialisieren, anstatt statische Konstruktoren explizit zu verwenden, da die Laufzeit die Leistung von Typen optimieren kann, die keinen explizit definierten statischen Konstruktor aufweisen.

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

Nachdruck mit freundlicher Genehmigung von Pearson Education, Inc., aus dem Buch 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 von Addison-Wesley Professional als Teil der Microsoft Windows Development Series.

Siehe auch