[C#] 36. 拡張メソッドを使い方


Study / C#    作成日付 : 2019/07/22 23:30:17   修正日付 : 2021/09/23 18:08:59

こんにちは。明月です。


この投稿はC#の拡張メソッドを使い方に関する説明です。


以前の投稿でC#のメソッド(関数)を使い方に関して説明したことがあります。

link - [C#] 9. 関数(Method)とオーバーロード、再帰呼び出し


関数というのはクラス内でデータを変更、処理する機能という文法です。

クラスを作成して関数を作って、クラスの外部から呼び出すことに関してはよく知っています。


でも、我々がプロジェクト内で作成したクラスではなく、.Net frameworkで提供するクラスや外部ライブラリから取得するクラスに関して関数を追加したい場合はどうしよう。

using System;

namespace Example
{
  class Program
  {
    //Stringタイプを関数でintタイプに変換する関数
    static int ConvertToIntFromString(String val, int def = -1)
    {
      try
      {
        // 変換
        return Convert.ToInt32(val);
      }
      catch
      {
        // エラーが発生すると基本データをリターン(default: -1)
        return def;
      }
    }
    // 実行関数
    static void Main(string[] args)
    {
      // stringタイプの値は1
      var data = "1";
      // stringからintタイプに変換
      var ret = ConvertToIntFromString(data);
      
      // ret変数のデータタイプ
      Console.WriteLine("ret data type = " + ret.GetType());
      // 値をコンソールに出力
      Console.WriteLine("ret value = " + ret);
      // 任意のキーを押してください
      Console.WriteLine("Press Any key...");
      Console.ReadLine();
    }
  }
}


上の例は基本的に関数生成と使う方法に関することです。

でも、もっとしやすくするためにConvertToIntFromString関数がStringクラスの関数みたいに設定したいです。

using System;

namespace Example
{
  // 拡張関数を作成するためのstatic class生成
  static class ExpendFunction
  {
    // 基本関数のタイプで始めのパラメータにthisキーワードを入れるとstringクラスの拡張メソッドになる。
    //Stringタイプの関数をintタイプに変換する関数
    public static int ConvertToIntFromString(this String val, int def = -1)
    {
      try
      {
        // 変換
        return Convert.ToInt32(val);
      }
      catch
      {
        // エラーが発生すると基本データをリターン(default: -1)
        return def;
      }
    }
  }
  class Program
  {
    // 実行関数
    static void Main(string[] args)
    {
      // stringタイプの値は1
      var data = "1";
      // stringからintタイプに変換(拡張関数)
      var ret = data.ConvertToIntFromString();
      // ret変数のデータタイプ
      Console.WriteLine("ret data type = " + ret.GetType());
      // 値をコンソールに出力
      Console.WriteLine("ret value = " + ret);
      // 改行
      Console.WriteLine();
      // stringからintタイプに変換(一般関数式)
      ret = ExpendFunction.ConvertToIntFromString(data);
      // ret変数のデータタイプ
      Console.WriteLine("ret data type = " + ret.GetType());
      // 値をコンソールに出力
      Console.WriteLine("ret value = " + ret);
      // 任意のキーを押してください
      Console.WriteLine("Press Any key...");
      Console.ReadLine();
    }
  }
}


始めの例と差異は拡張関数をstatic classに関数を生成しなければならないです。

staticが付けたらプログラムが起動する時、一括的に読み込みますが、その時に既存のStringクラスに関数を追加する役割をするらしいです。


拡張関数はstaticで生成すること、始めのパラメータにthisを付けて該当のクラスの拡張関数になります。

使用方法はstringでの関数みたいに使えます。


Visual studioのインテリジェンス(自動完成機能)にも関数があるみたいに制御になります。

そして拡張関数で設定しても既存方法みたいに一般関数を呼び出すことにも使うこともできます。


一般プロジェクトで処理機能だけある関数の場合、普通はUtilやCommon、Defineのクラスを作成して管理します。

その方法が悪いことではないですが、このみたいに拡張関数で設定して置いたら可読性やソース整理することにすごく良いと思います。


ここまでC#の拡張メソッドを使い方に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

#C#
最新投稿