2014年7月11日金曜日

C#応用 – LINQプログラミング 9




さて、LINQプログラミングの第9回

今回は、拡張メソッドについてである。




拡張メソッド
既に存在するクラスに機能を付加する。

var query = any.Where(x => myInclude(x)).Select(x => new { StationName = x });

foreach(var item in query)
{
    Console.WriteLine(item.StationName);
}


拡張メソッド(1)
既に存在しているクラス(コンパイル済みのものを含む)に対して
メソッドの追加が行える機能である。

たとえば、以下のようなものがある。
using System;

namespace MIC
{
    public static class StringExtension
    {
        // stringに対しての拡張メソッドである
        public static string AddABC(this string s)
        {
            return s + "ABC";
        }
    }
}


拡張メソッド(2)
使用方法は次のようになる。

using MIC;    // MICの拡張メソッドを使用するため

中略

string name = "マイクロソフト";
Console.WriteLine("{0}", name.AddABC());


拡張メソッドの記述方法
 作成の条件は次の通り。

  • staticメソッドである
  • staticクラスに記述されている
  • 第一パラメータの先頭にthisキーワードが記述されている
  • 第一パラメータの型が追加先となる型である  


拡張メソッドの特性
 拡張メソッドは以下の特徴がある。

  • 拡張メソッドの記述先をusingされなければ拡張されない
  • 同じ名前の拡張メソッドをもつ
    異なる名前空間を使用するのは不可
    例:同名の拡張メソッド「Ex」を持つ名前空間「NS1」と「NS2」を同時には使用できない
  • usingされるとsealedされたクラスも拡張可能
  • 元となる型のprivateやprotectedのメンバにはアクセスできない
  • 拡張メソッドは元のクラスの振る舞いは変更できない


追加された拡張メソッド
 List<T>のメンバを確認した
 
 ⇒実はList<T>ではなく、IEnumerable<T>の拡張メソッド
     
 ⇒つまり、これらの拡張メソッドは列挙に対して作用する機能

 実装はSystem.Linq.Enumerableクラス




ソースコード内の構文で

F1を押すと簡単にWebのマニュアルを

参照できるので非常に便利である。




今日の名言
人間にとって可能なあらゆる真に健康な楽しみを味わうことは、人間が初めて
この世に創造された時以来、可能であったし今でも可能である。そしてこれらの
楽しみが得られるのは主に心が平安である時である。麦が成長するのを見守る、
畑で鋤や鍬をふるって息を切らす、本を読み、考える、愛する、望む、神に祈る
これらはすべて人間を幸福にする事柄である。時折疲れ果てた王や虐げられた
奴隷が、この世の真の王国がどこにあるのかを見出し、庭の畑の一うねに
無限で真の領土を建設することがある。
                               ジョン・ラスキン

私の言い方は、行く手を遮る不幸に対してことごとく頭を下げろと主張している
ように聞こえるだろうか?断じてそうではない!それでは単なる運命論ではないか。
事態を好転させるチャンスがある限り闘うべきだ!けれども、常識で判断して
もはや万事休すとなれば、「悪あがきをしたり逆転を望んだりしない」ことが
正気の沙汰というものだ。
                               デール・カーネギー