委托的生明与使用

什么是委托
   首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。
 
如何使用委托
   在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。

-----------------------------------------------

定义一个委托:

委托的生明:可以在命名空间内的任何地方生明。用到的关键字: delegate

 public delegate void GreetHandler();//定义委托

class Program
    {
        static void Main(string[] args)
        {
            //创建委托方法(方法一)
            //GreetHandler greetHandler;
            //greetHandler = ChineseGreet;//赋值(第一个方法只能用赋值符)
            //greetHandler += EnglishGreet;//绑定方法
            //greetHandler -= ChineseGreet;//解除绑定
            //greetHandler();//使用委托

            //创建委托方法(方法二)
            GreetHandler greetHandler = new GreetHandler(ChineseGreet);
            greetHandler += EnglishGreet;
            greetHandler();
        }
        public static void ChineseGreet()
        {
            Console.WriteLine("早上好!");
        }
        public static void EnglishGreet()
        {
            Console.WriteLine("Good Morning!");
        }
    }

---------------------------------

有参数类型的委托 

先生明一个类 

 class Arithmetic
    {
        public int Add(int num1,int num2)
        {
            return num1 + num2;
        }
        public int Reduce(int num1, int num2)
        {
            return num1 - num2;
        }
    }

如果参数为引用类型时 : 在参数的前面加 一个 ref 的关键字

public delegate int ArithHandler(int num1, int num2);
    class Program
    {
        static void Main(string[] args)
        {
            Arithmetic arithmetic = new Arithmetic();
            ArithHandler arithHandler = new ArithHandler(arithmetic.Add);
            arithHandler += arithmetic.Reduce;
            int result = arithHandler(5, 3);//result接收最后一个方法执行的结果
            Console.WriteLine("结果为:" + result);
        }
    }

------------------------

委托也可以调用匿名方法 很多时候是用于只调用一次的方法:

 public delegate void HelloHandler();
    public delegate int CalHandler(int num1,int num2);
    class Program
    {
        static void Main(string[] args)
        {
            //将匿名方法赋给委托(无参无返回值的匿名方法)
            HelloHandler helloHandler = delegate()
            {
                Console.WriteLine("你好!");
            };
            helloHandler();

            //有参有返回值的匿名方法
            CalHandler calHandler = delegate(int a, int b)
            {
                int num = a + b;
                return num;
            };
            int result = calHandler(5,3);
            Console.WriteLine(result);
        }
    }

 --------------------------------------------

事件 事件是一种特殊的委托

 /*********事件*************/
    public delegate void GreetHandler();//定义委托
    class Program
    {
        public static event GreetHandler MyEvent;//声明事件(发布事件)
        static void Main(string[] args)
        {
            MyEvent += new GreetHandler(ChineseGreet);//订阅事件
            MyEvent += new GreetHandler(EnglishGreet);
            MyEvent();//触发事件
        }
        public static void ChineseGreet()
        {
            Console.WriteLine("早上好!");
        }
        public static void EnglishGreet()
        {
            Console.WriteLine("Good Morning!");
        }
    }

原文地址:https://www.cnblogs.com/cl1006/p/4467747.html