๐Ÿ“šDeleagte / Invoke

ํ•จ์ˆ˜๋ฅผ ๋‹ด๋Š” ๊ฐ์ฒด

์ผ๋ฐ˜์  ์‚ฌ์šฉ

class Program
{
    static void Main(string[] args)
    {
        new Program().Test();
    }

    // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ์ •์˜ -> ๊ทธ๋ฆ‡์˜ ๊ฐœ๋…์„ ์ •์˜
    delegate int MyDelegate(string s);

    void Test()
    {
        //๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด ์ƒ์„ฑ -> ๊ทธ๋ฆ‡ ์ƒ์„ฑ -> ํ•จ์ˆ˜๋ฅผ ๋‹ด์Œ
        MyDelegate m = new MyDelegate(StringToInt);

        //๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด(ํ•จ์ˆ˜๋‹ด์€ ๊ทธ๋ฆ‡)๋ฅผ ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌ
        Run(m);
    }

    // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ์–ด๋–ค ๋ฉ”์„œ๋“œ
    int StringToInt(string s)
    {
        return int.Parse(s);
    }

    // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ
    void Run(MyDelegate m)
    {
        // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋กœ๋ถ€ํ„ฐ ๋ฉ”์„œ๋“œ ์‹คํ–‰
        // ๊ทธ๋ฆ‡์— ๋‹ด๊ธด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰. -> StringToInt(string s)๋ฅผ ์‹คํ–‰ํ•œ๊ฑฐ์ž„.
        int i = m("123");

        Console.WriteLine(i);
    }
}

Delegate ์•ˆ์˜ ํ•จ์ˆ˜ ๋ฐ”๊ฟ”๋ฒ„๋ฆผ.

using System;
namespace MySystem
{
    class MyClass
    {
        // 1. delegate ์„ ์–ธ
        private delegate void RunDelegate(int i);

        private void RunThis(int val)
        {
            // ์ฝ˜์†”์ถœ๋ ฅ : 1024
            Console.WriteLine("{0}", val);
        }

        private void RunThat(int value)
        {
            // ์ฝ˜์†”์ถœ๋ ฅ : 0x400
            Console.WriteLine("0x{0:X}", value);
        }

        public void Perform()
        {
            // 2. delegate ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
            RunDelegate run = new RunDelegate(RunThis);
            // 3. delegate ์‹คํ–‰
            run(1024);

            //run = new RunDelegate(RunThat); ์„ ์ค„์—ฌ์„œ 
            //์•„๋ž˜์™€ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.
            run = RunThat;

            run(1024);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.Perform();
        }
    }
}

Delegate ๊ฐ์ฒด ๋‚ด์— ์—ฌ๋Ÿฌ๊ฐœ ํ•จ์ˆ˜ ๋“ฑ๋ก

class Program
{
    public delegate void testDelegate(string str);

    static void Main(string[] args)
    {
        testDelegate tDelegate;

        //tDelegate += aaa; //์ฒ˜์Œํ• ๋• ์•ˆ๋จ ์ดˆ๊ธฐํ™” ๋œ๊ฒŒ ์—†์–ด์„œ
        tDelegate = aaa;
        tDelegate("aaa");

        tDelegate += bbb;
        tDelegate("add bbb");

        tDelegate -= aaa;
        tDelegate("rm aaa");

    }

    static void aaa(string str)
    {
        Console.WriteLine("aaa str: {0}", str);
    }

    static void bbb(string str)
    {
        Console.WriteLine("bbb str: {0}", str);
    }

}

Invoke ์‚ฌ์šฉ ๊ด€๋ จ

class Program
{
    static void Main(string[] args)
    {
        new Program().Test();
    }

    // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ์ •์˜
    delegate int MyDelegate(string s);

    void Test()
    {
        //๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด ์ƒ์„ฑ
        MyDelegate m = new MyDelegate(StringToInt);

        //๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด๋ฅผ ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌ
        Run(m);
    }

    // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ์–ด๋–ค ๋ฉ”์„œ๋“œ
    int StringToInt(string s)
    {
        return int.Parse(s);
    }

    // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ
    void Run(MyDelegate m)
    {
        // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋กœ๋ถ€ํ„ฐ ๋ฉ”์„œ๋“œ ์‹คํ–‰
        int i = m("123");

        Console.WriteLine(i);
    }
}

Last updated