Pongeponge

Delegate


 久々にツイッターにログインしたらデリゲートがわからないと書いてあって
「自分やん」
と思ったのでまとめつつ備忘録として書いてみる。

delegate

 英語の意味としては代表・委任・権限の委譲、ということらしいです。
delegateキーワードを付けると代表者になれるってことですね。多分。


取りあえず書き
using System;
using System.Diagnostics;
using System.Collections.Generic;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            tes t = new tes();
        }
    }

    class tes
    {
        //デリゲート型を指定
        //デリゲート型芭蕉
        private delegate String basyou(String a, String b);
        //デリゲート型動物
        private delegate void doubutu(String s);

        public tes()
        {
            //例1
            basyou b = gyaku;
            Debug.WriteLine("芭蕉曰く「" + b("砕けない", "ダイヤモンドは") + "」");

            //例2
            List<basyou> k = new List<basyou>();

            k.Add(futuu);
            k.Add(gyaku);

            foreach (basyou i in k)
            {
                Debug.WriteLine("芭蕉曰く「" + i("君たちは", "腐ったミカンだ") + "」");
            }

            //例3(匿名型)
            basyou n = delegate (string a1, string a2) { return a1.Replace("神","ネコ") + a2; };
            Debug.WriteLine(n("神と", "和解せよ"));

            //例4(ラムダ式)
            basyou op = (c1, c2) => c2.Replace("か", "");
            Debug.WriteLine(op("力が", "欲しいか"));

            //例5(デリゲートの連結) ActionかFuncじゃないと無理?(未確認)
            doubutu pome, ame, nanika;
            pome = inu;
            ame = neko;
            nanika = pome + ame;
            nanika("ティラノサウルス");
        }

        //結合
        private String futuu(String a, String b)
        {
            return a + b;
        }

        //前後を逆にして結合
        private String gyaku(String a, String b)
        {
            return b + a;
        }

        //これは犬です
        private void inu(string s)
        {
            Debug.WriteLine(s + "は犬");
        }

        //疑いようもなく猫です
        private void neko(string s)
        {
            Debug.WriteLine(s + "は猫");
        }

    }
}


出力

芭蕉曰く「ダイヤモンドは砕けない」
芭蕉曰く「君たちは腐ったミカンだ」
芭蕉曰く「腐ったミカンだ君たちは」
ネコと和解せよ
欲しい
ティラノサウルスは犬
ティラノサウルスは猫


 これ、関数ポインタじゃないの?というのが最初の感想。

連結

・ActionやFuncのタイプじゃないと連結してくれないんだろうか?