c#委托与事件
最近在研究委托,在此跟大家分享下。
委托时什么
官方的讲:委托就是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看做是对函数的抽象,是函数的"类",委托的实例将代表一个具体的函数。
另一种教容易理解的解释:委托是一个类,它定义了方法的类型,使方法可以当作另一个方法的参数来进行传递。
看完定义可能是一脸懵逼,下面我们在以实例来说明:
我在网上购买的东西到菜鸟驿站了,但是我今天要加班,无法自己去取,所有我就打电话让妹妹去帮我拿下快递,下面我们代码实现,第一版无委托
public class Courier { private Sister sister; public Courier(Sister sister) { this.sister = sister; } public void Nofice() { Tike(); sister.Take(); } public void Tike() { Console.WriteLine("你的快递到了"); Console.WriteLine("----------------"); } } public class Sister { public void Take() { Console.WriteLine("帮我取下快递哦,妹妹"); Console.WriteLine("好的,马上取"); } } /// <summary> /// 客户端 /// </summary> class Program { static void Main(string[] args) { Courier courier = new Courier(new Sister()); courier.Nofice(); } } //结果 你的快递到了 ---------------- 帮我取下快递哦,妹妹 好的,马上取
第二部,引入委托
public delegate void TakeEventHandler(); //声明委托 public class Courier { public event TakeEventHandler take;//定义事件,相当于委托的变量 public void Nofice() { Tike(); take(); } public void Tike() { Console.WriteLine("你的快递到了"); Console.WriteLine("----------------"); } } public class Sister { public void Take() { Console.WriteLine("帮我取下快递哦,妹妹"); Console.WriteLine("好的,马上取"); } } /// <summary> /// 客户端 /// </summary> class Program { static void Main(string[] args) { Courier courier = new Courier(); courier.take += new TakeEventHandler(new Sister().Take); courier.Nofice(); } } View Code
这就是委托的应用,委托被人帮你完成,生活中有很多这样的例子,
在程序中引入委托解耦了Courier类与Sister类,使类直接不相互依赖,这样Sister类的改变都不会影响到Courier
下面我们来分析一下
1.声明一个为委托
public delegate void TakeEventHandler(); 定义了一个方法的类型,既返回值为void,无参类型的TakeEventHandler
2.声明一个事件:
public event TakeEventHandler take;
3.将被委托的方法注册到事件:
courier.take += new TakeEventHandler(new Sister().Take);//+=是注册,-=是注销
4.触发需要委托的方法:
courier.Nofice();
5.需要委托的方法中有事件的触发
public void Nofice()
{
Tike();
take();//
}
总结
面向对象的思想:职责分明。自己不用做的事,就委托给该干这事的人。
通过委托,实现了Courier和Sister之间的解耦。即Courier要用Sister的方法,但没有直接调用。
提高了代码的可扩展性,如果此时Courier还有别的事情,如要买菜,就可以把买菜委托给另一个Sister,这时,只需要再添加一个Sister类,里面写上买菜的方法,在主方法中将买菜注册到委托的事件中。就可以实现委托另一个Sister去买菜了。整个过程不会对原有程序进行任何改动。所以使用委托,提高了程序的可扩展性。