次の方法で共有


コンストラクターの設計

このコンテンツは、 フレームワーク設計ガイドライン (再利用可能な .NET ライブラリの規則、イディオム、パターン、第 2 版) から、Pearson Education, Inc. のアクセス許可によって再印刷されます。 そのエディションは2008年に出版され、その後 、本は第3版で完全に改訂されています。 このページの情報の一部が古くなっている可能性があります。

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

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

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

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

✔️ シンプルで理想的な既定のコンストラクターを提供することを検討してください。

単純なコンストラクターには非常に少数のパラメーターがあり、すべてのパラメーターはプリミティブまたは列挙型です。 このような単純なコンストラクターにより、フレームワークの使いやすさが向上します。

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

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

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

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

このようなパラメーターとプロパティの唯一の違いは、大文字と小文字を区別する必要があります。

✔️ コンストラクターで最小限の作業を行います。

コンストラクターは、コンストラクター パラメーターをキャプチャする以外に多くの作業を行わないでください。 その他の処理のコストは、必要になるまで延期する必要があります。

✔️ 必要に応じて、インスタンス コンストラクターから例外をスローします。

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

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

パラメーター化されたコンストラクターをクラスに追加すると、コンパイラはパラメーターなしのコンストラクターを追加できなくなります。 これは、多くの場合、偶発的な破壊的変更を引き起こします。

❌ 構造体でパラメーターなしのコンストラクターを明示的に定義することは避けてください。

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

❌ コンストラクター内のオブジェクトで仮想メンバーを呼び出すのを避けます。

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

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

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

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

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

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

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

Portions © 2005, 2009 Microsoft Corporation. 無断転載を禁じます。

フレームワーク設計ガイドライン:再利用可能な .NET ライブラリの規則、イディオム、パターン、Krzysztof Cwalina および Brad Abrams による第 2 版は、2008 年 10 月 22 日に Microsoft Windows 開発シリーズの一部として Addison-Wesley Professional によって公開されました。

こちらも参照ください