首页 > 其他 > 详细

《委托和事件》

时间:2019-07-11 20:45:40      阅读:95      评论:0      收藏:0      [点我收藏+]

委托(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/zhangyuG/p/11172523.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!