C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#の拡張メソッドとは?定義方法と使い方を実例付きで解説

拡張メソッド(Extension Methods)とは

拡張メソッドは、既存の型に対してインスタンスメソッドであるかのように呼び出せる静的メソッドです。この機能を利用すると、新しい派生クラスを作成したり、既存のコードを再コンパイルしたり、元の型そのものに変更を加えたりすることなく、既存の型へ新しいメソッドを追加できます。

C#では標準ライブラリの string 型や int 型など、自分では修正できない型に対しても、この仕組みによって自由に機能を追加できるのが大きな魅力です。

拡張メソッドの定義方法

拡張メソッドを定義する際は、以下のルールに従います。

  • static クラス内に宣言する
  • メソッド自体も static 修飾子を付けて宣言する
  • 第一引数に this キーワードと、拡張したい型を指定する

以下は、文字列を整数に変換する拡張メソッドの例です。

public static int myExtensionMethod(this string str) {
    return Int32.Parse(str);
}

第一引数の this string str により、このメソッドは string 型に対する拡張メソッドとして認識されます。

拡張メソッドの使用例

続いて、拡張メソッドを実際に呼び出す完全なプログラム例を見てみましょう。

using System;
using System.Text;
namespace Program {
    public static class Demo {
        public static int myExtensionMethod(this string str) {
            return Int32.Parse(str);
        }
    }
    class Program {
        static void Main(string[] args) {
            string str1 = "565";
            int n = str1.myExtensionMethod();
            Console.WriteLine("Result: {0}", n);
            Console.ReadLine();
        }
    }
}

実行結果

Result: 565

コードの解説

このプログラムでは、string 型の変数 str1 に対して myExtensionMethod() を、あたかも string 型が最初から持っているインスタンスメソッドのように直接呼び出しています。

内部的には Demo.myExtensionMethod(str1) のような静的な呼び出しが行われていますが、構文上は自然な形で記述できるため、コードの可読性と再利用性が大きく向上します。

まとめ

  • 拡張メソッドは static クラス内の static メソッドとして定義する
  • 第一引数に this キーワードと拡張対象の型を指定する
  • 呼び出し側は通常のインスタンスメソッドと同じ構文で使用できる
  • 元の型を変更・継承することなく、既存の型に機能を追加できる
  1. JavaScriptのオブジェクトメソッドとは?使い方とサンプルコードを解説

    JavaScriptにおけるオブジェクトメソッドとは、オブジェクトに対して実行できる操作(アクション)のことです。オブジェクトは文字列や数値などのデータ(プロパティ)だけでなく、関数を値として持つことができ、この関数が「メソッド」として機能します。メソッド内では this キーワードを使用することで、そのオブジェクト自身が持つプロパティへアクセスできます。これは、オブジェクト指向プログラミングにおいて非常に重要な概念です。オブジェクトメソッドのサンプルコード以下は、ユーザーの入力した名前と年齢から、成人かどうかを判定するメソッドを持つオブジェクトを作成する例です。<!DOCTYPE ht

  2. JavaScriptでプロトタイプを使ってメソッドを共有する方法

    JavaScriptにおけるメソッドの共有JavaScriptでは、メソッドをオブジェクト(コンストラクタ関数)のprototypeプロパティに定義することで、複数のインスタンス間でそのメソッドを共有できます。通常、コンストラクタ内でthis.displayInfo = function(){...}のようにメソッドを定義すると、生成されるインスタンスごとに関数のコピーが作成され、メモリを無駄に消費します。一方、prototypeに定義すれば、関数は一度だけ生成され、すべてのインスタンスから参照・呼び出しできるようになります。これはメモリ効率の面でも大きなメリットがあります。以下は、JavaS