C# 委托和事件

来源:互联网 发布:程序员工作时间 编辑:程序博客网 时间:2024/06/05 15:53
什么是委托

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。

委托的声明
public delegate void MyEventHandler(string str);

在C#中使用delegate关键字定义委托,然后使用我们熟悉的函数调用的语法来调用委托,EventHandler是一个声明委托的微软C#的命名标准

在现实生活中委托就相当于一个“命令”,具体做什么事是被委托人的事,程序中委托只是存储了方法的一个地址,它自己什么也没做。委托中参数类型、返回值必须和方法的参数类型、返回值一致,一个简单的例子:

class Program    {        //声明一个委托        public delegate void BugTicketEventHandler();        static void Main(string[] args)        {            //实例一个委托,指向BuyTicket方法            BugTicketEventHandler b = new BugTicketEventHandler(MrZhang.BuyTicket);            //顺便带张电影票            b += MrZhang.BuyMovieTicket;            b();            Console.ReadKey();        }    }    //小张类,被委托人    public class MrZhang    {        public static void BuyTicket()        {            Console.WriteLine("NND,每次都让我带饭!");        }        public static void BuyMovieTicket()        {            Console.WriteLine("你妹的,还要让我带电影票");        }    }

执行结果:
这里写图片描述

委托事件

可以说事件是一个特殊的多播委托。也可以说事件是类型对外暴露的只读委托线性表
使用事件对应的成员变量会被视为private变量,外界无法超越事件所在对象直接访问它们,这使事件具备良好的封装性

声明事件:
 //声明一个出版的委托        public delegate void PublishEventHander();        //在委托的机制下我们建立以个出版事件        public event PublishEventHander OnPublish;

在我们使用事件的时候,必须要声明对应的委托,而触发事件,其实就是在使用委托链。

一个简单的例子:

public delegate void MyDelegate(string name);    public class PersonManager    {        public event MyDelegate MyEvent;        //执行事件        public void Execute(string name)        {            if (MyEvent != null)                MyEvent(name);        }    }    class Program    {        static void Main(string[] args)        {            Console.WriteLine("请输入您的名字:");            string name = Console.ReadLine();            PersonManager personManager = new PersonManager();            //绑定事件处理方法            personManager.MyEvent += new MyDelegate(GetName);            personManager.Execute(name);            Console.ReadKey();        }        public static void GetName(string name)        {            Console.WriteLine("My name is " + name);        }    }

执行结果:
这里写图片描述

绑定不同的事件处理方法:

public delegate void MyDelegate(string name);    public class PersonManager    {        public event MyDelegate MyEvent;        //订阅不同的事件        public void Process(string name, Lenguage lenguage)        {            if (lenguage == Lenguage.Chinese)            {                //绑定事件处理方法                MyEvent = new MyDelegate(GetChineseName);            }            if (lenguage == Lenguage.English)            {                //绑定事件处理方法                MyEvent = new MyDelegate(GetEnglishName);            }            Execute(name);        }        public static void GetEnglishName(string name)        {            Console.WriteLine("My name is " + name);        }        public static void GetChineseName(string name)        {            Console.WriteLine("我的名字是" + name);        }        //执行事件        protected void Execute(string name)        {            if (MyEvent != null)                MyEvent(name);        }    }    class Program    {        static void Main(string[] args)        {            Console.WriteLine("请输入您的名字:");            string name = Console.ReadLine();            PersonManager personManager = new PersonManager();            personManager.Process(name, Lenguage.Chinese);            personManager.Process(name, Lenguage.English);            Console.ReadKey();        }    }    public enum Lenguage    {        English,        Chinese    }

运行结果:
这里写图片描述

原创粉丝点击