コンストラクタの使用方法のガイドライン
次の規則は、コンストラクタの使用方法のガイドラインを示しています。
クラスに静的メソッドと静的プロパティしか存在しない場合は、既定のプライベート コンストラクタを提供します。プライベート コンストラクタにより、クラスを作成できないようにする例を次に示します。
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) }