コンテンツへスキップ
C#の拡張メソッドとは何ですか?

C#の拡張メソッドとは何ですか?

C#の拡張メソッドについてよく質問を受けます。拡張メソッドは、C# バージョン 3.0 で導入されました。また、既存のクラスを変更、拡張、または再コンパイルせずに、既存のクラスに機能を追加できます。

4min read

C#の拡張メソッドについてよく質問を受けます。拡張メソッドは、C# バージョン 3.0 で導入されました。また、既存のクラスを変更、拡張、または再コンパイルせずに、既存のクラスに機能を追加できます。

基本的に、拡張メソッドを使用すると、既存のクラスに新しいメソッドを追加できます。

  • 変更したりコードを追加したりせずに
  • 拡張したり、新しい派生型を作成したりせずに
  • クラスを再コンパイルせずに
拡張メソッドは特殊な種類の静的メソッドですが、インスタンスメソッドのようなオブジェクトで呼び出すことができます。したがって、拡張メソッドは、通常のインスタンスメソッドと同じように使用できます。

拡張メソッドは特殊な種類の静的メソッドですが、インスタンスメソッドのようなオブジェクトで呼び出すことができます。したがって、拡張メソッドは、通常のインスタンスメソッドと同じように使用できます。

拡張メソッドを作成する手順

ステップ1:拡張メソッドまたは拡張メソッドを含む静的な可視クラスを定義します。適切なアクセス修飾子を適用して、クラスがクライアント コードに表示されることを確認します。

ステップ2:少なくとも包含クラスと同じ可視性レベルを持つ静的メソッドを作成します。

ステップ3:拡張メソッドの最初のパラメーターは、常にメソッドが操作する型を指定します。型名の前に "this" 修飾子が付いていることを確認します。

ステップ4:呼び出し元のコードで、Extension Method クラスを含む名前空間を追加します。

ステップ5:同じインスタンス内の型で拡張メソッドを使用できます。最初のパラメータはタイプを示すため、渡す必要はありませんが、拡張メソッドを呼び出すには 2 番目のパラメータ以降を渡す必要があることに注意してください。

拡張メソッドを作成しよう!

先に進んで、StringクラスのExtensionメソッドを作成しましょう。string クラスにはWordCountメソッドはありません。コンソールアプリケーションプロジェクトの作成から始めて、コンソールアプリケーションプロジェクトにクラスを追加しましょう。クラスにStringExtensionという名前を付けます。

クラスが作成されたら、前に説明した手順を実行する必要があります。

  1. この場合、クラスを静的でパブリックにします
  2. Add a static method
  3. クラスはパブリックなので、メソッドもパブリックにします
  4. 静的メソッドの最初のパラメータを、キーワード「this」を前に付けたクラスの名前として渡します
  5. メソッド内にコードを記述して機能を実装します
namespace ExtensionMethodDemo
{
    public static class StringExtension
    {
        public static int WordCount(this string s)
        {
            int count = 0;
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] != ' ')
                {
                    if ((i + 1) == s.Length)
                    {
                        count++;
                    }
                    else
                    {
                        if (s[i + 1] == ' ')
                        {
                            count++;
                        }
                    }
                }
            }
            return count;
        }
    }
}

上記のコードリストでは、特定の文字列内の単語数をカウントするための拡張メソッドを作成しました。次のことに気づくかもしれません。

  1. StringExtension クラスは public static クラスです。
  2. WordCount メソッドはパブリック静的メソッドです。
  3. WordCount メソッドの最初のパラメーターは、文字列クラスの拡張メソッドとして WordCount を作成しているため、文字列です。
  4. 最初のパラメーター型文字列の前には、キーワード "this" が付きます。

Extension Methodを使用する前に、プロジェクトをコンパイルしてみましょう。これを行うには、次の手順を実行する必要があります。

  1. 別のライブラリに拡張メソッドを作成した場合は、クライアントプロジェクトにDLLを追加します。
  2. Extension Method クラスの名前空間を using ディレクティブで追加します。
  3. 通常のインスタンスメソッドとして拡張メソッドを使用します。

次のリストに示すように、新しく作成した拡張メソッドを使用できます。

using System;

namespace ExtensionMethodDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter a senetence");
            string inputstr = Console.ReadLine();
            int numberofword = inputstr.WordCount();
            Console.WriteLine(numberofword);
            Console.ReadKey(true);
        }
    }
}

上記のリストでわかるように、拡張メソッド WordCount は、文中の単語数をカウントするために使用されます。Visual Studio では、次の図に示すように、メソッド名の横に extension という単語を追加することで、インテリセンスで拡張メソッドも表示されます。

は、次の図に示すように、メソッド名の横に extension という単語を追加することで、インテリセンスで拡張メソッドを示しています

ご覧のとおり、拡張メソッドは、他のインスタンスメソッドと同じように使用できます。インスタンスメソッドと拡張メソッドが同じ名前とシグネチャを持つシナリオがある可能性があります。その場合、常にインスタンス メソッドが拡張メソッドよりも優先されます。 Extension メソッドについて留意すべき重要な点がいくつかあります。

  1. インスタンスメソッドよりも優先度が低いため、クラスに同じ名前とシグネチャを持つ拡張メソッドとインスタンスメソッドがある場合、インスタンスメソッドが優先されます。
  2. 拡張メソッドがターゲット型のメンバー メソッドと競合する場合は、拡張メソッドの代わりにメンバー メソッドが常に呼び出されます。
  3. 拡張メソッドは、ターゲット型のプライベート メンバーにのみアクセスできます。

拡張メソッドは、既存のクラスに機能を追加するのに非常に便利です。多くの LINQ 関数は、拡張メソッドとして実装されます。ここで提供される情報があなたのプロジェクトに役立つことを願っています、そして読んでくれてありがとう!

デモを予約