C#のコールバックとデリゲートの違いはなんなのか!

この記事は約 4 分で読めます。

みなさんこんにちはヒロポンです!

今回も技術系の記事を書いていきたいと思います!

今回はコールバックについて!と、デリゲートについて!

コールバックっていうのはJavaScriptでは当たり前のように使われていますが、一方のデリゲートはC#だけのものです。

とはいえこの二つ結構混同して覚えてしまう方も多いと思うので、その解説をしていきたいと思います!

C#でのコールバックとは何?

一言で言ってしまえば関数を引数とかで渡して別の関数内で実行してもらう行為!と覚えてもらえば良いと思います!

例えば下記のようなコード

namespace CallBackNDelegate
{
    class Program
    {
        static void Main(string[] args)
        {
            Say(SayHello);
            Console.ReadLine();
        }

        static void SayHello()
        {
            Console.WriteLine("HelloWorld");
        }

        static void Say(Action action)
        {
            action();
        }
    }
}

これはSayHelloという関数をSay関数の中で実行しているんですね。

Say関数は引数無しの戻り値voidの関数を実行するようになっています。

これだと少しわかりずらいので別のパターンを紹介します。

    class Program
    {
        static void Main(string[] args)
        {
            Say2(GetHello);
            Console.ReadLine();
        }

        static string GetHello(string str)
        {
            return $@"Hello {str}";
        }

        static void Say2(Func<string, string> func)
        {
            var hello = func("CSharp");
            Console.WriteLine(hello);
        }
    }

今回は引数stringで戻り値stringの関数を引数にしたSay2関数を用意しました。

GetHello関数はStringを引数にして、戻り値は頭にHelloと付けるだけ。

この関数を実行しているのはあくまでもSay2です。

C#のコールバックは関数を別のところで実行する行為

って事でC#のコールバックのまとめは、下記です。

  • コールバックは関数を別のところで実行する行為。

C#でのデリゲートとは?

では次にデリゲートについてですが、ものすごくミニマムでデリゲートを説明すると、デリゲートは関数の型をあらかじめ作っておいて色々できるようにする仕組みです。

下記のコードを見てください。

    public static class Delegate
    {
        public delegate string GetHelloDelegate(string str);

        public delegate void SayHelloDelegate();

        public static void Say()
        {
            var func = new SayHelloDelegate(() => Console.WriteLine("Hello World"));
            func();
        }

        public static void Say2()
        {
            var func = new GetHelloDelegate(str => $@"Hello {str}");
            Console.WriteLine(func("CSharp"));
        }
    }

GetHelloDelegateは戻り値string、引数stringの関数の型を宣言しています。

また一方のSayHelloDelegateは引数も戻り値もない関数の型を宣言しています。

で、ここから面白いのですが、型なのでNewすることができます。

このNewの引数の中で関数の宣言をすることができます。

ものすごくシンプルな話をすると関数を引数とか変数として使うときの型がDelegateってな感じで把握をしておけば、この先Delegateの便利な機能を知った時になるほど!ってなるかもしれませんね!

まとめ

  • Callbackは関数を別の場所で実行する行為
  • Delegateは関数を引数とか変数で使うときに使用する型

以上

今回のコードはGithubに上げています!

今回ブログのサンプルで書いたコードはGithubに上げています!

興味があればgit cloneしてローカルでお試しください!

https://github.com/adaman3568/blog-source-demo

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA