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

コンストラクターには、型コンストラクターとインスタンス コンストラクターの 2 種類があります。There are two kinds of constructors: type constructors and instance constructors.

型コンストラクターは静的であり、型が使用される前に CLR によって実行されます。Type constructors are static and are run by the CLR before the type is used. インスタンス コンストラクターは、型のインスタンスが作成されるときに実行されます。Instance constructors run when an instance of a type is created.

型コンストラクタはパラメータを受け取ることができません。Type constructors cannot take any parameters. インスタンス コンストラクターは、できます。Instance constructors can. パラメーターを受け取らないインスタンス コンストラクターは、パラメーターなしのコンストラクターと呼ばれることがよくあります。Instance constructors that don’t take any parameters are often called parameterless constructors.

コンストラクタは、型のインスタンスを作成する最も自然な方法です。Constructors are the most natural way to create instances of a type. ほとんどの開発者は、インスタンスを作成する別の方法 (ファクトリ メソッドなど) を検討する前に、コンストラクタを検索して使用しようとします。Most developers will search and try to use a constructor before they consider alternative ways of creating instances (such as factory methods).

✔️は、単純で理想的なデフォルトのコンストラクタを提供することを検討してください。✔️ CONSIDER providing simple, ideally default, constructors.

単純なコンストラクターは、パラメーターの数が非常に少なくて、すべてのパラメーターはプリミティブまたは列挙型です。A simple constructor has a very small number of parameters, and all parameters are primitives or enums. このような単純なコンストラクタは、フレームワークの使いやすさを高める。Such simple constructors increase usability of the framework.

✔️必要な操作のセマンティクスが新しいインスタンスの構築に直接マップされない場合、またはコンストラクタ設計ガイドラインに従う際に不自然な場合は、コンストラクタの代わりに静的ファクトリメソッドを使用することを検討してください。✔️ CONSIDER using a static factory method instead of a constructor if the semantics of the desired operation do not map directly to the construction of a new instance, or if following the constructor design guidelines feels unnatural.

メイン プロパティを設定するためのショートカットとしてコンストラクタ パラメータを使用✔️。✔️ DO use constructor parameters as shortcuts for setting main properties.

空のコンストラクタの後に何らかのプロパティセットを使用することと、複数の引数を持つコンストラクタを使用する場合のセマンティクスに違いはありません。There should be no difference in semantics between using the empty constructor followed by some property sets and using a constructor with multiple arguments.

コンストラクターパラメーターを使用して単にプロパティを設定する場合は、コンストラクターパラメーターとプロパティに同じ名前を使用✔️ DO。✔️ DO use the same name for constructor parameters and a property if the constructor parameters are used to simply set the property.

このようなパラメータとプロパティの違いは大文字と小文字の区別だけです。The only difference between such parameters and the properties should be casing.

✔️コンストラクタで最小限の作業を行います。✔️ DO minimal work in the constructor.

コンストラクターは、コンストラクター パラメーターをキャプチャする以外に多くの作業を行う必要があります。Constructors should not do much work other than capture the constructor parameters. 他の処理のコストは、必要になるまで遅延する必要があります。The cost of any other processing should be delayed until required.

必要に応じて、インスタンス コンストラクターから例外をスロー✔️ DO。✔️ DO throw exceptions from instance constructors, if appropriate.

✔️は、クラスで public パラメーターなしのコンストラクターを明示的に宣言します (そのようなコンストラクターが必要な場合)。✔️ DO explicitly declare the public parameterless constructor in classes, if such a constructor is required.

型のコンストラクターを明示的に宣言しない場合、多くの言語 (C# など) は、パラメーターなしのパブリック コンストラクターを自動的に追加します。If you don’t explicitly declare any constructors on a type, many languages (such as C#) will automatically add a public parameterless constructor. (抽象クラスは、プロテクト コンストラクタを取得します。(Abstract classes get a protected constructor.)

パラメーター化されたコンストラクターをクラスに追加すると、コンパイラはパラメーターなしのコンストラクターを追加できなくなります。Adding a parameterized constructor to a class prevents the compiler from adding the parameterless constructor. これにより、誤って破損した変更が発生することがよくあります。This often causes accidental breaking changes.

❌構造体にパラメーターなしのコンストラクターを明示的に定義する回避。❌ AVOID explicitly defining parameterless constructors on structs.

これにより、パラメーターなしのコンストラクターが定義されていない場合、配列内のすべてのスロットで実行する必要がないため、配列の作成が高速化されます。This makes array creation faster, because if the parameterless constructor is not defined, it does not have to be run on every slot in the array. C# を含む多くのコンパイラでは、このような理由で構造体にパラメーターなしのコンストラクターを含めることができない点に注意してください。Note that many compilers, including C#, don’t allow structs to have parameterless constructors for this reason.

❌コンストラクタ内のオブジェクトの仮想メンバーを呼び出すことは避けてください。❌ AVOID calling virtual members on an object inside its constructor.

仮想メンバーを呼び出すと、最派生型のコンストラクターがまだ完全に実行されていない場合でも、最も派生したオーバーライドが呼び出されます。Calling a virtual member will cause the most derived override to be called, even if the constructor of the most derived type has not been fully run yet.

型コンストラクタのガイドラインType Constructor Guidelines

静的コンストラクターをプライベートに✔️します。✔️ DO make static constructors private.

静的コンストラクターは、クラス コンストラクターとも呼ばれ、型の初期化に使用されます。A static constructor, also called a class constructor, is used to initialize a type. CLR は、型の最初のインスタンスが作成される前に静的コンストラクターを呼び出すか、その型の静的メンバーが呼び出されます。The CLR calls the static constructor before the first instance of the type is created or any static members on that type are called. ユーザーは、静的コンストラクターが呼び出されたときに制御できません。The user has no control over when the static constructor is called. 静的コンストラクターがプライベートでない場合は、CLR 以外のコードから呼び出すことができます。If a static constructor is not private, it can be called by code other than the CLR. コンストラクターで実行される操作によっては、予期しない動作が発生する場合があります。Depending on the operations performed in the constructor, this can cause unexpected behavior. C# コンパイラは、静的コンストラクターをプライベートに強制します。The C# compiler forces static constructors to be private.

❌静的コンストラクターから例外をスローしないでください。❌ DO NOT throw exceptions from static constructors.

型コンストラクターから例外がスローされた場合、その型は現在のアプリケーション ドメインで使用できません。If an exception is thrown from a type constructor, the type is not usable in the current application domain.

✔️は、静的コンストラクターを明示的に使用するのではなく、静的フィールドをインラインで初期化します。✔️ CONSIDER initializing static fields inline rather than explicitly using static constructors, because the runtime is able to optimize the performance of types that don’t have an explicitly defined static constructor.

2005年、2009年©マイクロソフト株式会社。すべての権利が予約されています。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. の許可を得て再印刷されています。Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.

関連項目See also