zoukankan      html  css  js  c++  java
  • 《委托和事件》

    委托(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;
            }
  • 相关阅读:
    hdu4675 GCD of Sequence 莫比乌斯+组合数学
    hdu4746 Mophues 莫比乌斯
    BZOJ2820 YY的GCD 莫比乌斯+系数前缀和
    bzoj2005 能量采集 莫比乌斯或者普通容斥
    GCD 莫比乌斯反演 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对.
    spoj7001 Visible Lattice Points 莫比乌斯反演+三维空间互质对数
    hdu1695 GCD 莫比乌斯反演做法+枚举除法的取值 (5,7),(7,5)看做同一对
    bzoj2440 完全平方数 莫比乌斯值+容斥+二分
    Problem b 莫比乌斯反演+枚举除法的取值
    Codeforces839D Winter is here 容斥
  • 原文地址:https://www.cnblogs.com/zhangyuG/p/11172523.html
Copyright © 2011-2022 走看看