C#_拡張メソッド

静的メソッドをインスタンスメソッドと同じ形式で
呼び出せるようにしたもの

特徴

  1. 前置き記法である静的メソッドを後置き記法でかける
  2. あたかも新しいクラスにメソッドを追加したかのように見せる
  3. 定義側第 1 引数の前に this を付ける
  4. 利用側:インスタンスメソッドと同じ書き方。

(関数指向。オブジェクト指向ではない)

 

コード

Ⅰ) int x = int.Parse("1");

Ⅱ) int x = "1".Parse();

と書けるようになる。

hoge = new Hoge();
hoge.hhhh();            ←インスタンスメソッド

 

Ⅱ) を書くためには、

static class Extensions
{
    public static int Parse(this string str)
    {
        return int.Parse(str);
    }
}

という静的メソッドを用意する。

 

2 ) の 新しいクラスにメソッドを追加したかのように~。について

→既存のクラスにメソッドを追加している(ようにみえる)ので
拡張メソッドという。
(以前はクラスの機能拡張=メソッド追加をしたければ、
継承などして新しいクラスを作る必要があった。)

定義方法

静的クラス(static class)の中、第一引数に、
this を修飾子としてつけた static メソッドを書く。

ex)

static class StringExtensions
{
    public static string ToggleCase(this string s)
    {
        //処理
    }
}

以下のように呼べる。

string s = "This is a Test."
//通常の呼び出し方
string s1 = StringExtensions.ToggleCase(s);
//拡張メソッドの呼び出し
s.ToggleCase();

 


---using ディレクティブによる拡張メソッドのインポート---

通常、静的メソッドは「クラス名.メソッド名」という記法で呼ぶ。
だが、拡張メソッドは「クラス名」をさぼって書けるようになっている。

では「どのメソッドが呼ばれるか」を決定しているのか。

「using ディレクティブ」で指定した名前空間の中にある拡張メソッド
参照されるようになっている
故に、
同じ名前空間内に2つ以上同名の拡張メソッドを定義してはいけない

 

他、優先順位やら問題点、意義があるが深そうなので後回し。
とりあえず、インスタンスが必要でないメソッド静的で
と言われているので、静的でかく。

 

こちらから。
http://ufcpp.net/study/csharp/sp3_extension.html

 

以上。