zoukankan      html  css  js  c++  java
  • C#学习笔记(10)——再谈委托,不同国家问候的例子

    说明(2017-6-14 09:08:38):

    1. 首先是一个简单的委托

    (1)命名空间下定义一个委托MyDel:

    public delegate void MyDel(string name);

    这个委托其实就是个壳,用来替换后面的EnglishSayHello和ChineseSayHello。

    (2)声明一个函数SayHello来存放这个委托:public static void SayHello(string name,MyDel del)。

    (3)然后在主函数里就可以使用这个SayHello函数调用委托,里面就可以换这两个方法了:

    SayHello("Jack",EnglishSayHello);
    SayHello("Ashley",ChineseSayHello);

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace _11控制台委托
    {
        public delegate void MyDel(string name);
        class Program
        {
            static void Main(string[] args)
            {
                SayHello("Jack",EnglishSayHello);
                SayHello("Ashley",ChineseSayHello);
                Console.ReadKey();
            }
            public static void SayHello(string name,MyDel del)
            {
                del(name);
            }
    
            public static void EnglishSayHello(string name)
            {
                Console.WriteLine("Good Morning! "+name);
            }
            public static void ChineseSayHello(string name)
            {
                Console.WriteLine("早上好!"+name);
            }
        }
    }

     2. 然后是委托的绑定:

    其实可以不需要SayHello这个中间方法的,直接在主函数里实例化一个委托,但是不能new Delegate(),因为会提示“没有0个参数的重载”。

    要这样,赋值一个方法:

    MyDel del = EnglishSayHello;

    再这样,再绑定一个方法:

    del += ChineseSayHello;

    调用这个委托后,会依次调用所有绑定的方法,所以直接输出两句问候了:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace _11控制台委托
    {
        public delegate void MyDel(string name);
        class Program
        {
            static void Main(string[] args)
            {
                MyDel del = EnglishSayHello;
                del += ChineseSayHello;
                del("Jack");
                //SayHello("Jack",EnglishSayHello);
                //SayHello("Ashley",ChineseSayHello);
                Console.ReadKey();
            }
            //public static void SayHello(string name,MyDel del)
            //{
            //    del(name);
            //}
    
            public static void EnglishSayHello(string name)
            {
                Console.WriteLine("Good Morning! "+name);
            }
            public static void ChineseSayHello(string name)
            {
                Console.WriteLine("早上好!"+name);
            }
        }
    }

     3. 修改一下代码,以便下面引出事件:

    这个做法不保密,如果用private修饰符,不能访问就失去委托的意义了;如果用public修饰符,委托可以随便赋值了不安全。因此需要使用事件event,将委托进行封装,只能+=和-=,不能=赋值。相当于字段与属性。

    (1)MyDelegate类,把上面的几个方法放到单独的类文件里(实际开发中的样子),并且在类里直接定义一个MyDel类型的del字段,在SayHello里,判断一下del是否为空,不为空就调用。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace _11控制台委托
    {
        public delegate void MyDel(string name);
         class MyDelegate
        {
             public MyDel del;
             public void SayHello(string name)
             {
                 if (del != null)
                 {
                     del(name);
                 }
                 
             }
            public void EnglishSayHello(string name)
            {
                Console.WriteLine("Good Morning! " + name);
            }
            public void ChineseSayHello(string name)
            {
                Console.WriteLine("早上好!" + name);
            }
        }
    }

    (2)Program类,实例化MyDelegate,将md.del赋值和绑定两个方法,md.SayHello的时候就只带name参数就可以了,不需要del参数了。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace _11控制台委托
    {
        //public delegate void MyDel(string name);
        class Program
        {
            static void Main(string[] args)
            {
                MyDelegate md = new MyDelegate();
                md.del = md.EnglishSayHello;
                md.del += md.ChineseSayHello;
                md.SayHello("Jack");
               
                Console.ReadKey();
            }
        }
    }

     4. 事件,到这里其实就很简单了,把上面的代码简单修改两处:

    (1)在MyDel委托前面加个event关键字:

    (2)这时候就会提示:

    将=变成+=,问题解决:

     参考资料:

    http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

  • 相关阅读:
    Android 开发遇到的问题及解决办法
    Android Studio HelloWorld
    Android Studio与Genymontion的安装
    自定义简单版本python线程池
    唯一图库爬取图片
    网页登陆验证之图片验证码
    向后台提交数据:利用cookie加session提交更多数据,
    向后台提交数据:cookie,secure_cookie,
    利用js里的Dom和Date,自定义cookie的前端设置方法
    向后台提交数据:通过form表单提交数据需刷新网页 但通过Ajax提交数据不用刷新网页可通过原生态Ajax或jqueryAjax。Ajax代码部分
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/7007086.html
Copyright © 2011-2022 走看看