Jacklovely

导航

 

说明(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

posted on 2017-06-14 09:12  Jacklovely  阅读(349)  评论(0编辑  收藏  举报