特定のインスタンスに関連する場合は、インスタンス メンバー (メソッド、プロパティ、またはフィールド) である必要があります。これらは最も一般的なケースであるため、例は豊富です。
特定のインスタンスに関連しない場合、インスタンス メンバーには、他の方法で使用しないインスタンスが必要です。良い例はMath.Max
です。 を呼び出しMath.Max(43, 23)
た場合、結果は 43 が 23 より大きいという事実に関連しMath
、アプリケーションの実行中に変更される可能性があるオブジェクトのプロパティには関連しません。
一部のクラスは静的メンバーのみを必要とするため、クラス自体を静的にし、インスタンス化することはまったくできません。
特定のインスタンスではなくクラスの性質に関連するプロパティも、同じ理由で静的にする必要があります。たとえばint.MaxValue
、 は のプロパティでありint
、eg 93 のプロパティではありません。
int.MaxValue
の結果自体がであることに注意してくださいint
。これは珍しいことではありません。その他の例としては、TimeSpan.Zero
およびがありstring.Empty
ます。これは便利であり、多くの参照型の重複を防ぐ上でパフォーマンス上の利点となる場合もあります (値型の場合は無関係であり、参照型の場合は誇張されていません)。これをやりすぎないことが重要です。4294967296 個の異なる静的プロパティをオンint
にして、それらを「簡単に」呼び出す必要はありません! 通常、これは次の場合に役立ちます。
特殊なケースは、コンストラクターによって構築できません。
また:
特殊なケースは、一般的に使用される ( TimeSpan.Zero
) および/または覚えるのに不便です (またはint.MaxValue
よりも明確で覚えやすい)。もちろん、それが両方である場合はなおさらです。2147483647
0x7FFFFFFF
拡張メソッドは、インスタンス メンバーであるかのように呼び出すことができる静的メソッドです。これらは非常に便利ですが、通常は、可能な場合はインスタンス メンバーを使用することをお勧めします。インスタンス メンバーが不可能な場合に役立ちます。理由は次のとおりです。
- クラスのソースにアクセスできません (別のパーティのクラスです)。
- クラスではなくインターフェースで定義したい。
- null で呼び出し可能にする必要があります (これは C# では慣用的ではありませんが、他の言語ではより一般的です)。
- ジェネリックの特定のケースに対してそれを定義したいとします。たとえば、
MyDictionary<TKey, TValue>
その実装を作成した場合、TValue が既知の数値型である場合にのみ機能するため、格納された値に数値を追加するメソッドをIDictionary<TKey, TValue>
定義できません。plus
そのようなメソッドを拡張メソッドとして定義できます。そのようなメソッドは、intint Plus<TKey>(this MyDictionary<TKey, int> dict, int addend)
の場合にインスタンス メンバーのように表示されますが、他の型パラメーターTValue
の使用を妨げません。MyDictionary
これらのすべてのケースでは、拡張メソッドを使用する以外に選択肢はありませんが、インスタンス メンバーがジョブを実行する場合は使用しないでください。特に他の一部の .NET 言語は拡張メンバーを静的としてしか認識しないため、より明確です。