• 委托与事件


    委托(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;
            }
  • 相关阅读:
    团队作业8----第二次项目冲刺(beta阶段)5.20
    团队作业8——第二次项目冲刺(Beta阶段) 5.19
    团队作业8——Beta项目(冲刺计划)
    团队作业——Alpha冲刺之事后诸葛亮
    团队作业5——测试与发布(Alpha版本)
    团队作业6——展示博客(Alpha版本)
    团队作业4——第一次项目冲刺(Alpha版本)2017.4.28
    团队作业4——第一次项目冲刺(Alpha版本)2017.4.27
    团队作业4——第一次项目冲刺(Alpha版本)2017.4.26
    团队作业4——第一次项目冲刺(Alpha版本)2017.4.25
  • 原文地址:https://www.cnblogs.com/ssz00/p/11201503.html
Copyright © 2020-2023  润新知