独習C#勉強メモ4

独習C#を読んで自分が知らなかったことまとめ

デリゲート


デリゲードで表したメソッドはint型、string型みたいに引数とかに入れる事ができる。
//クラスの外で定義
delegate void DoDeligate(string str);

class DelegateTest
    {
        static void Heppoko(string s)
        {
            //Heppokoの処理内容
            Console.WriteLine(s);
        }
        static void StringCount(string s)
        {
            //StringCountの処理内容
            int num = s.Length;
            Console.WriteLine(num);
        }
        //プログラムが動いたとき一回だけこの中の処理が動く前提で例を書いている。

        void start()
        {
            //Heppokoメソッドが使える
            var v1 = new DoDeligate(Heppoko);
            //これは
            //DoDeligate del = method;
            //とも書ける。
            v1("へっぽこ太郎");
            //DoDeligateメソッドが使える
            var v2 = new DoDeligate(StringCount);
            v2("へっぽこ太郎");
        }
    }

マルチキャストデリゲート


デリゲートはメソッドを1個だけじゃなくて複数受け取ることもできる。 上のHeppoko,StringCountメソッドがある前提で例を書くと

DoDeligate del = method;
//追加でStringCountメソッドもdelの中に入る。
del += StringCount;
del("へっぽこ");
//これで2つのメソッドが同時に実行される。

これはadmob広告の挙動を変えるのによく使われてる処理。 -=で登録を削除することもできる。

匿名メソッド


いちいちDoDelegateみたいな変数を用意するほどでもない場合はFuncを使って手軽にすることもできる。

class DeligateAnonymous
    {
        //ここのfuncではメソッドの内容は決めない。
        //<>の中身は数によって決まってる。今回は<引数の型、返り値の型>になるみたいです。
        // <>の中が1個だと引数はなしで<>に入れた種類によって返り値の型を決定できる。
        void ArrayWalk(int[] data, Func<int,string> output)
        {
            foreach(var i in data)
            {
                //各string要素に対してやりたい処理
                //outputメソッドにiという引数を入れた実行結果が帰ってくる。
                output(i);
            }
        }
        void start()
        {
            var data = new[] {1,2,3 };
            var dm = new DeligateAnonymous();
            //outputメソッドの具体的に中身は{}で定義されている。
            dm.ArrayWalk
                (data, delegate (int s){return s.ToString();/*ここがメソッドの本体*/}
                );
        }
    }

Action


funcが値を返す処理内容が決まってないメソッドなのに対してActionは値を返さない処理内容が決まってないメソッド。 値を入れてなんか処理をするだけで返り値はない。

class DeligateAnonymous
    {
        //Actionの場合はfuncと違って返り値の定義はしない。両方とも引数の型を定義
        void ArrayWalk(int[] data, Action<int,string> output)
        {
            string s = "へっぽこ";
            foreach(var i in data)
            {
                output(i,s);
            }
        }
        void start()
        {
            var data = new[] {1,2,3 };
            var dm = new DeligateAnonymous();
            //ここの第一引数と第二引数がActionの<>の中で決定されてる。
            dm.ArrayWalk
                (data, delegate (int i,string s){
                    i.ToString();
                    s.ToLower();
                    /*ここがメソッドの本体*/}
                );
        }
    }

ラムダ式


匿名メソッドすらだるいよって場合の書き方。ざっくり書くと

(string s) => { return s + ".txt"; }
//全体として引数sをブロック{}の中で使って値を返す処理
//真面目に書くと
string returnAddText(string s){
    return s+".tdt";
}

匿名メソッドもラムダ式も根っこの考え方はデリゲートから派生した感じ?

LINQ


Language INtegrated Queryのことでコレクション、データベース、XML文書とか色々なデータにアクセスする統一的な方法。いちいちmySQLとかデータベースにはSQL文、自分で作ったコレクションデータ(List型のデータとか)はforeachで分解してデータを取り出すとかが不便でだるいからC#で統一しましょうって話みたいです。 LINQプロバイダーとやらで切り替えるみたいです。いろいろ書いてあるけど必要だったら調べる。


See also