コンストラクターのデザイン

Note

このコンテンツは、Pearson Education, Inc. の許可を得て、『Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition (フレームワーク設計ガイドライン: 再利用可能な .NET ライブラリの規約、表現形式、およびパターン、第 2 版)』から転載されています。 この版は 2008 年に出版され、その後、この本は第 3 版で全面的に改訂されました。 このページの情報の一部は以前のものである可能性があります。

コンストラクターには、型コンストラクターとインスタンス コンストラクターの 2 種類があります。

型コンストラクターは静的であり、型が使用される前に CLR によって実行されます。 インスタンス コンストラクターは、型のインスタンスが作成されるときに実行されます。

型コンストラクターは、パラメーターを受け取ることができません。 インスタンス コンストラクターはできます。 パラメーターを受け取らないインスタンス コンストラクターは、通常、パラメーターなしのコンストラクターと呼ばれます。

コンストラクターは、型のインスタンスを作成する最も自然な方法です。 ほとんどの開発者は、インスタンスを作成する代わりの方法 (ファクトリ メソッドなど) を検討する前に、コンストラクターを探して使おうとします。

✔️ 単純な、できれば既定の、コンストラクターを提供することを検討します。

単純なコンストラクターとは、ごく少数のパラメーターを持ち、すべてのパラメーターがプリミティブまたは列挙型であるものです。 そのような単純なコンストラクターを用意すると、フレームワークの使いやすさが向上します。

✔️ 目的の操作のセマンティクスが新しいインスタンスの構築に直接対応しない場合、またはコンストラクターの設計ガイドラインに従うと不自然に感じる場合は、コンストラクターの代わりに静的ファクトリ メソッドの使用を検討します。

✔️ メイン プロパティを設定するためのショートカットとして、コンストラクターのパラメーターを使用します。

空のコンストラクターを使用して後でいくつかのプロパティを設定する場合と、複数の引数を持つコンストラクターを使用する場合とで、セマンティクスに違いがあってはなりません。

✔️ コンストラクターのパラメーターがプロパティの設定だけに使用される場合は、コンストラクターのパラメーターとプロパティに同じ名前を使用します。

そのようなパラメーターとプロパティの違いは、大文字と小文字の区別だけでなければなりません。

✔️ コンストラクターでの処理は最小限にします。

コンストラクターのパラメーターをキャプチャする以外の多くの処理を、コンストラクターで行ってはなりません。 他のすべての処理のコストは、必要になるまで延期する必要があります。

✔️ 必要な場合は、インスタンス コンストラクターから例外をスローします。

✔️ パブリックのパラメーターなしコンストラクターが必要な場合は、クラスでそのようなコンストラクターを明示的に宣言します。

型のコンストラクターを明示的に宣言しない場合、多くの言語 (C# など) では、パブリックのパラメーターなしコンストラクターが自動的に追加されます。 (抽象クラスは、保護されたコンストラクターを受け取ります。)

パラメーター化されたコンストラクターをクラスに追加すると、パラメーターなしのコンストラクターはコンパイラによって追加されなくなります。 これにより、破壊的変更が誤って発生することがよくあります。

❌ 構造体ではパラメーターなしのコンストラクターを明示的に定義しないようにします。

パラメーターなしのコンストラクターが定義されていない場合は、配列内のすべてのスロットでそれを実行する必要がないため、これにより配列の作成が高速になります。 このような理由から、C# などの多くのコンパイラでは、構造体でパラメーターなしのコンストラクターを使用できないことに注意してください。

❌ コンストラクターの内部では、オブジェクトの仮想メンバーを呼び出さないようにします。

最も派生した型のコンストラクターがまだ完全には実行されていない場合でも、仮想メンバーを呼び出すと、最も派生したオーバーライドが呼び出されます。

型コンストラクターのガイドライン

✔️ 静的コンストラクターはプライベートにします。

静的コンストラクター (クラス コンストラクターとも呼ばれます) は、型を初期化するために使用されます。 型の最初のインスタンスが作成される前、またはその型の静的メンバーが呼び出される前に、CLR によって静的コンストラクターが呼び出されます。 ユーザーは、静的コンストラクターが呼び出されるタイミングを制御できません。 静的コンストラクターがプライベートでない場合、CLR 以外のコードから呼び出すことができます。 コンストラクターで実行される操作によっては、これにより予期しない動作が発生することがあります。 C# コンパイラでは、静的コンストラクターは強制的にプライベートにされます。

❌ 静的コンストラクターから例外をスローしないでください。

型コンストラクターから例外がスローされた場合、その型は現在のアプリケーション ドメインで使用できなくなります。

✔️ 静的フィールドの初期化は、静的コンストラクターを使用して明示的に行うのではなく、インラインで行うことを検討します。これは、明示的に定義された静的コンストラクターを持たない型の場合、ランタイムでパフォーマンスを最適化できるためです。

Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

2008 年 10 月 22 日に Microsoft Windows Development シリーズの一部として、Addison-Wesley Professional によって発行された、Krzysztof Cwalina および Brad Abrams による「Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition」 (フレームワーク デザイン ガイドライン: 再利用可能な .NET ライブラリの規則、用法、パターン、第 2 版) から Pearson Education, Inc. の許可を得て再印刷されています。

関連項目