Looking for c# Answers? Try Ask4KnowledgeBase
Looking for c# Keywords? Try Ask4Keywords

C# Language拡張メソッド


構文

  • public static ReturnType MyExtensionMethod(このTargetTypeターゲット)
  • public static ReturnType MyExtensionMethod(このTargetTypeターゲット、TArg1 arg1、...)

パラメーター

パラメータ詳細
この拡張メソッドの最初のパラメータの前には必ずthisキーワードが続き、拡張するオブジェクトの「現在の」インスタンスを参照する識別子が続きます

備考

拡張メソッドは、オブジェクトインスタンス上でスタティックメソッドを型自体のメンバのように呼び出すことを可能にするシンタックスシュガーです。

拡張メソッドには、明示的なターゲットオブジェクトが必要です。拡張キーワードそのものからメソッドにアクセスするには、 thisキーワードを使用する必要があります。

拡張メソッドは静的宣言され、静的クラスに存在しなければなりません。

どの名前空間ですか?

拡張メソッドクラスのネームスペースの選択は、可視性と発見性のトレードオフです。

最も一般的に言及されているオプションは、拡張メソッドのカスタム名前空間を持つことです。しかし、これには、コードのユーザーが拡張メソッドが存在すること、およびそれらを見つける場所を知るように、コミュニケーションが必要です。

別の方法として、開発者がIntellisenseを使用して拡張メソッドを検出できるように名前空間を選択する方法があります。したがって、 Fooクラスを拡張したい場合は、拡張メソッドをFooと同じ名前空間に配置するのが理にかなっています。

"誰か他人"の名前空間を使用することを妨げるものは何もないことを認識することが重要です 。したがって、 IEnumerableを拡張する場合は、 System.Linq名前空間に拡張メソッドを追加できます。

これは必ずしも良い考えではありません。たとえば、ある特定のケースでは、一般的な型( bool IsApproxEqualTo(this double value, double other)を拡張することができますが、 System全体を '汚染する'ことはできません。この場合、ローカルの特定の名前空間を選択することが望ましいです。

最後に、拡張メソッドを名前空間に全く入れないことも可能です!

良い参照の質問: 拡張メソッドの名前空間をどうやって管理していますか?

適用範囲

拡張メソッドを作成して、可能なすべての入力に適していることを確認し、特定の状況に関連するだけでなく、拡張メソッドを作成するときは注意が必要です。たとえば、 stringなどのシステムクラスを拡張して、新しいコードを任意の文字列で使用できるようにすることができます。コードがドメイン固有の文字列形式でドメイン固有のロジックを実行する必要がある場合、その存在がシステム内の他の文字列を扱う呼び出し元を混乱させるため、拡張メソッドは適切ではありません。

次のリストに、拡張メソッドの基本的な機能とプロパティを示します

  1. これは静的メソッドでなければなりません。
  2. 静的クラスに配置する必要があります。
  3. これは、 "this"キーワードを.NETの型を持つ最初のパラメータとして使用し、このメソッドはクライアント側の指定された型インスタンスによって呼び出されます。
  4. それはまた、VS intellisenseによって示された。私たちは、ドットを押すと.タイプインスタンスの後、それはVS intellisenseで来る。
  5. 拡張メソッドは、使用されているのと同じ名前空間にあるか、usingステートメントでクラスの名前空間をインポートする必要があります。
  6. 拡張メソッドを持つクラスには任意の名前を付けることができますが、クラスは静的でなければなりません。
  7. 型に新しいメソッドを追加したいが、そのためのソースコードがない場合は、その型の拡張メソッドを使用して実装することです。
  8. 拡張している型と同じシグネチャメソッドを持つ拡張メソッドを作成した場合、拡張メソッドは決して呼び出されません。

拡張メソッド 関連する例