English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 拡張メソッド

その名の通りのように、拡張メソッドは追加メソッドです。拡張メソッドは、元のクラス、構造体、インターフェースを修正、派生、再コンパイルすることなく、他のメソッドを注入するために使用できます。拡張メソッドは、自分自身のカスタムクラス、.NET Framework クラス、サードパーティクラス、またはインターフェースに追加できます。

拡張メソッドの定義

拡張メソッドは C# です 3.0 で追加された機能は、ソースクラスのコードを変更せずに、ADD File モードで機能を拡張できます。

拡張メソッドの要件は以下の通りです:

  • 拡張メソッドは static修飾クラスに含まれていなければなりません。

  • 拡張実装は静的形態でなければなりません。

  • 拡張メソッドの最初のパラメータは this で始まり、これは拡張されるクラスのオブジェクトを示し、2番目のパラメータからは拡張メソッドのパラメータリストが始まります。

以下の例では、IsGreaterThan() は int 型の拡張メソッドであり、int 型の変数の値が提供された整数パラメータを超える場合に true を返します。

int i = 10;
bool result = i.IsGreaterThan;100); //FALSE を返します

IsGreaterThan() メソッドは int データ型のメソッドではありません (Int32 struct)。これはプログラマーが int データ型に書いた拡張メソッドです。IsGreaterThan() 拡張を含む名前空間を含むと、IsGreaterThan() 拡張メソッドはアプリケーションの全体で利用可能になります。

 拡張メソッドは Visual Studioの intellisense で特別なシンボルを持っており、そのため、クラスメソッドと拡張メソッドを簡単に区別できます。

Visual Studio 智能感知の拡張メソッドシンボル

拡張メソッドの書き方

それでは、拡張メソッドの書き方を見てみましょう。

LINQ は IEnumerable と IQeryable タイプに対する拡張メソッドに基づいています。

拡張メソッドは、実際には静的クラスで定義された特別な静的メソッドです。拡張メソッドを定義するには、まず静的クラスを定義します。

以下の例では、ExtensionMethods ナームスペースの下にクラス IntExtensions を作成しました。IntExtensions クラスは、int データ型に適用されるすべての拡張メソッドを含みます。(ナームスペースやクラスには、どのような名前でも使用できます。)

namespace ExtensionMethods
{
    public static class IntExtensions
    {
    }
}

今では、静的メソッドを拡張メソッドとして定義し、拡張メソッドの最初のパラメータが拡張メソッドに適用されるタイプを指定します。intタイプにこの拡張メソッドを使用するため、最初のパラメータ intの前にthis 修飾子。

例えば、IsGreaterThan()メソッドはintに対して操作を行うため、最初のパラメータはthis int iです。

namespace ExtensionMethods
{
    public static class IntExtensions
     {
        public static bool IsGreaterThan(this int i, int value)
        {
            return i > value;
        }
    }
}

今では、この拡張メソッドを使用したい場所のどこにでも ExtensionMethods ナームスペースを含めることができます。

拡張メソッドの使用

using ExtensionMethods;
class Program
{
    static void Main(string[] args)
    {
        int i = 10;
        bool result = i.IsGreaterThan;100); 
        Console.WriteLine(result);
    }
}
出力:
false
通常の静的メソッドと拡張メソッドの唯一の違いは、拡張メソッドの最初のパラメータが演算子に対して操作を行うタイプを指定し、それに続いて this キーワード。

拡張メソッドの原則のまとめ

  1. C#は拡張メソッドのみをサポートし、拡張プロパティ、拡張イベント、拡張演算子などはサポートしていません。

  2. 拡張メソッド(thisの前にある最初のパラメータのメソッド)は、非泛型の静的クラスで宣言されなければなりません。拡張メソッドはパラメータを持たなければなりませんが、最初のパラメータのみthisタグを使用します。

  3. C#コンパイラが静的クラス内の拡張メソッドを探す際には、これらの静的クラス自体がファイルスコープを持っている必要があります。

  4. C#コンパイラは拡張メソッドの「インポート」を要求します。(静的メソッドは任意の名前を使用できますが、C#コンパイラはメソッドを探す際に時間を要し、ファイルスコープ内のすべての静的クラスをチェックし、そのすべての静的メソッドをスキャンして一致するものを探します)

  5. 複数の静的クラスが同じ拡張メソッドを定義できます。
    あるタイプに拡張メソッドを追加すると、その派生タイプも同時に拡張されます。

拡張メソッドの宣言

  • 非嵌套的、非泛型的静态クラス中でなければなりません(したがって、静的メソッドでなければなりません)

  • 少なくとも1つのパラメータが必要です。

  • 最初のパラメータはthisキーワードで前置される必要があります。

  • 最初のパラメータには他の修飾子(例えばrefまたはout)はありません。

  • 最初のパラメータの型はポインタ型ではありません。

覚えておくべきポイント

  • 拡張メソッドは、最初にクラスに含まれていない他のカスタムメソッドです。

  • 拡張メソッドは、カスタム、.NET Framework、またはサードパーティのクラス、構造体、インターフェースに追加できます。

  • 拡張メソッドの最初のパラメータは、拡張メソッドが適用される型で、それに続いてthisキーワード。

  • 拡張メソッドを含む名前空間を通じて、アプリケーションのどこでも拡張メソッドを使用できます。