委托与事件

委托(Delegate):值得是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
声明委托(Delegate):委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。
实例化委托(Delegate):一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。
委托的多播(Multicasting of a Delegate):委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。
委托可以有4中定义方式:
委托的第一种赋值方式:NEW
委托的第二种赋值方式:直接赋值
委托的第三种赋值方式:匿名方法
委托的第四种渎职方式:委托变量声明之后使用+=,-=
        /

/定义一个 无返回值的 无参数的委托
        public delegate void ShowDelegate();
        //定义一个 无返回值的 有参数的 委托
        public delegate void Show2Delegate(string msg);
        //定义一个 有返回值的 有参数的 委托
        public delegate string Show3Delegate(string msg);
        //定义一个用来测试多播委托的 委托
        public delegate void PrintLogDelegate(string log);
        public DelegateTest()
        {
            Console.WriteLine("=====委托的第一种赋值方式  new=====");
            ShowDelegate ds = new ShowDelegate(Show);
            ds();//委托的第一种调用方式
            ds.Invoke();//委托的第2种调用方式
            Console.WriteLine("=====委托的第2种赋值方式  直接赋值=====");
            Show2Delegate ds_2 = Show2;
            ds_2.Invoke("委托的赋值  直接赋值");//显示调用
            Console.WriteLine("=====委托的第3种赋值方式  匿名方法=====");
            Show2Delegate sd_3 = (msg) =>
            {
                Console.WriteLine(msg);
            };
            sd_3.Invoke("委托的赋值  匿名方法");
            Console.WriteLine("=====委托的第4种赋值方式  委托变量声明之后使用+=、-=    =====");
            Show2Delegate sd_4 = null;
            sd_4 += Show2;
            sd_4 += (msg) => { Console.WriteLine("匿名方法赋值:"+msg); };
            sd_4.Invoke("委托变量声明之后使用+=、-= ");

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();
            Show2Delegate ds2 = new Show2Delegate(Show2);
            ds2("这是一个有参数的委托");
            ds2("委托的隐式调用");
            ds2.Invoke("委托的显示调用");
            Console.WriteLine("====调用有返回值 有参数的委托========");
            Show3Delegate sd3 = new Show3Delegate(Show3);
            //接收委托的返回值
            string str =  sd3.Invoke("这是有返回值 有参数的委托的测试");
            Console.WriteLine(str);
            Console.WriteLine("==============多播委托====================");
            PrintLogDelegate printLog = null;
            printLog += Print1;
            printLog += Print2;
            printLog += Print3;
            //调用
            printLog.Invoke("多播委托的测试");
            printLog -= Print3;
            printLog.Invoke("多播委托的测试_去掉一个方法");

            Console.ReadKey();
        }

        public void Print1(string log)
        {
            Console.WriteLine("Print1:" + log);
        }
        public void Print2(string log)
        {
            Console.WriteLine("Print2:" + log);
        }
        public void Print3(string log)
        {
            Console.WriteLine("Print3:" + log);
        }
        public void Show()
        {
            Console.WriteLine("我是具体的方法实现");
        }
        public void Show2(string msg)
        {
            Console.WriteLine("Show2:" + msg);
        }
        public string Show3(string msg)
        {
            return "返回:" + msg;
        }
原文地址:https://www.cnblogs.com/ssz00/p/11201503.html