Richtlinien für die Verwendung von Konstruktoren

Die folgenden Regeln dienen als Richtlinie für die Verwendung von Konstruktoren:

  • Stellen Sie einen privaten Standardkonstruktor bereit, wenn nur statische Methoden und Eigenschaften für eine Klasse vorhanden sind. Im folgenden Beispiel verhindert der private Konstruktor die Erstellung der Klasse.

    NotInheritable Public Class Environment
       ' Private constructor prevents the class from being created.
       PrivateSub New()
          ' Code for the constructor goes here.
       End Sub
    End Class
    [C#]
    public sealed class Environment
    {
       // Private constructor prevents the class from being created.
       privateEnvironment()
       {
          // Code for the constructor goes here.
       }
    }
    
  • Minimieren Sie die Vorgänge, die der Konstruktor ausführt. Ein Konstruktor sollte lediglich den Konstruktorparameter bzw. die Konstruktorparameter erfassen. Dadurch wird der Aufwand für die Ausführung weiterer Operationen auf den Zeitpunkt verschoben, zu dem der Benutzer eine bestimmte Funktion der Instanz verwendet.

  • Geben Sie für jede Klasse einen Konstruktor an. Verwenden Sie einen privaten Konstruktor, wenn ein Typ nicht erstellt werden soll. Wenn Sie keinen Konstruktor angeben, fügen viele Programmiersprachen (z. B. C#) implizit einen öffentlichen Standardkonstruktor hinzu. Wenn die Klasse abstrakt ist, wird ein geschützter Konstruktor hinzugefügt.

    Beachten Sie, dass der implizite Standardkonstruktor entfernt wird, wenn Sie in einer späteren Version einer Klasse einen Nicht-Standardkonstruktor hinzufügen, wodurch im Clientcode Fehler entstehen können. Es wird daher empfohlen, den Konstruktor stets explizit anzugeben, selbst wenn es sich um einen öffentlichen Standardkonstruktor handelt.

  • Stellen Sie einen protected (in Visual Basic Protected)-Konstruktor bereit, der von den Typen in einer abgeleiteten Klasse verwendet werden kann.

  • Konstruktoren sollten nicht ohne Parameter für den struct-Werttyp bereitgestellt werden. Beachten Sie, dass es bei vielen Compilern nicht zulässig ist, dass struct einen Konstruktor ohne Parameter besitzt. Wenn Sie keinen Konstruktor bereitstellen, initialisiert die Runtime alle Felder von struct mit Null. Dies beschleunigt die Erstellung von Arrays und statischen Feldern.

  • Verwenden Sie Parameter in Konstruktoren als Kurzbefehle für die Festlegung von Eigenschaften. Zwischen der Semantik für einen leeren Konstruktor, gefolgt von set-Eigenschaftsaccessoren, und der Semantik für einen Konstruktor mit mehreren Argumenten sollte kein Unterschied bestehen. Die folgenden drei Codebeispiele sind gleichbedeutend:

    ' Example #1.
    Dim SampleClass As New Class()
    SampleClass.A = "a"
    SampleClass.B = "b"
    
    ' Example #2.
    Dim SampleClass As New Class("a")
    SampleClass.B = "b"
    
    ' Example #3.
    Dim SampleClass As New Class("a", "b")
    [C#]
    // Example #1.
    Class SampleClass = new Class();
    SampleClass.A = "a";
    SampleClass.B = "b";
    
    // Example #2.
    Class SampleClass = new Class("a");
    SampleClass.B = "b";
    
    // Example #3.
    Class SampleClass = new Class ("a", "b");
    
  • Verwenden Sie ein konsistentes Anordnungs- und Benennungsschema für Konstruktorparameter. Gemäß dem üblichen Schema für Konstruktorparameter stellen Sie eine steigende Anzahl von Parametern bereit, damit der Entwickler die Möglichkeit hat, die gewünschte Menge an Informationen anzugeben. Je mehr Parameter Sie festlegen, desto mehr Details kann der Entwickler angeben. Im folgenden Codebeispiel ist ein konsistentes Anordnungs- und Benennungsschema für alle SampleClass-Konstruktoren vorhanden.

    Public Class SampleClass
       Private Const defaultForA As String = "default value for a"
       Private Const defaultForB As String = "default value for b"
       Private Const defaultForC As String = "default value for c"
    
       Public Sub New()
          MyClass.New(defaultForA, defaultForB, defaultForC)
          Console.WriteLine("New()")
       End Sub
    
       Public Sub New(a As String)
          MyClass.New(a, defaultForB, defaultForC)
       End Sub 
    
       Public Sub New(a As String, b As String)
          MyClass.New(a, b, defaultForC)
       End Sub 
       Public Sub New(a As String, b As String, c As String)
          Me.a = a
          Me.b = b
          Me.c = c
       End Sub
    End Class
    [C#]
    public class SampleClass 
    {
       private const string defaultForA = "default value for a";
       private const string defaultForB = "default value for b";
       private const string defaultForC = "default value for c";
    
       public MyClass():this(defaultForA, defaultForB, defaultForC) {}
       public MyClass (string a) : this(a, defaultForB, defaultForC) {}
       public MyClass (string a, string b) : this(a, b, defaultForC) {}
       public MyClass (string a, string b, string c)
    }
    

Siehe auch

Entwurfsrichtlinien für die Entwicklung von Klassenbibliotheken | Richtlinien für die Verwendung von Klassenmembern