コンストラクタの使用方法のガイドライン

次の規則は、コンストラクタの使用方法のガイドラインを示しています。

  • クラスに静的メソッドと静的プロパティしか存在しない場合は、既定のプライベート コンストラクタを提供します。プライベート コンストラクタにより、クラスを作成できないようにする例を次に示します。

    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.
       }
    }
    
  • コンストラクタでは、最小限の処理しか実行しないようにします。コンストラクタで実行する処理は、コンストラクタのパラメータのキャプチャだけにします。これによって、ユーザーがインスタンスの特定の機能を使用するまでの間、その他の操作を実行することによってパフォーマンスに影響が及ぶことがなくなります。

  • 各クラスにコンストラクタを用意します。型を作成しない場合は、プライベート コンストラクタを使用します。コンストラクタを指定しない場合、多くのプログラミング言語 (C# など) は既定のパブリック コンストラクタを暗黙で追加します。クラスが抽象クラスの場合は、protected コンストラクタが追加されます。

    以降のバージョン リリースで既定でないコンストラクタを追加すると、暗黙の既定のコンストラクタが削除され、クライアント コードが壊れることになります。このため、たとえパブリックの既定のコンストラクタであっても、常に明示的にコンストラクタを指定するのが最良の方法です。

  • 派生クラスの型によって使用できる protected (Visual Basic の場合は Protected) コンストラクタを提供します。

  • struct 型にパラメータを持たないコンストラクタは提供しないでください。多くのコンパイラでは、struct がパラメータのないコンストラクタを持つことは許可されていません。コンストラクタを提供しないと、ランタイムによって struct のすべてのフィールドがゼロに初期化されます。これにより、配列と静的フィールドがより速く作成されるようになります。

  • プロパティを設定するための手段として、コンストラクタのパラメータを使用します。空のコンストラクタを使用してから、続けてプロパティの set アクセサを使用することと、複数の引数を指定してコンストラクタを使用することは、意味的には同じになります。次の 3 つのコードは同義です。

    ' 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");
    
  • コンストラクタのパラメータの順序付けおよび名前付けには、一貫したパターンを使用します。コンストラクタ パラメータの一般的なパターンでは、開発者が必要なレベルの情報を指定できるように、パラメータの数を適宜増やしていきます。提供するパラメータの数が多いほど、開発者がより詳細な情報を指定できるようになります。次のコード例では、すべての SampleClass コンストラクタに対して、一貫性したパラメータの順序付けおよび名前付けパターンが適用されています。

    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)
    }
    

参照

クラス ライブラリ開発者向けのデザイン ガイドライン | クラス メンバの使用方法のガイドライン