zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#里事件和委托有什么区别啊

c#事件 什么 区别 委托
2023-09-11 14:14:13 时间

 一 、使用位置不同

事件只能在本类型内部“触发”,委托不管在本类型内部还是外部都可以“调用”。

 二、使用符号不同

在类的外部,事件只能用“+=”和“-=”去订阅/取消订阅,如果是委托的话还可以使用“=”。

 

委托的本质,是一个,而事件,是委托这个类的一个私有变量加上两个公有方法(事件的+=和-=这两个公有方法,和委托实例的+=和-=功能上非常像,但并不是同一个东西),这是本质区别。

打个比方,string 也是一个类,而string s = "a",这个s是string这个类的一个变量(略有不恰当,为了方便直观理解,那么,委托是和string这个类同等的地位,而事件,是和s这个变量同等的地位)。

public delegate void myDel();相当于你创建了一个myDel的类,所以委托可以在任何地方创建,类需要实例化,所以委托需要实例化,要myDel m = ……;

申明一个事件 public event myDel myEvent;

事件myEvent类似于是一个myDel类型的一个变量,因为是变量,所以事件只能在类里面申明,不需要实例化,有点类似于上面的那个m。

既然myEvent(类似)和变量m都是myDel类型的一个变量,为什么还要弄一个事件这种东西出来,变量m不就可以实现事件的需求(监听,广播)吗?这里牵涉到了面向对象的一些设计理念,事件可以理解为委托实例m的一个约束版。

第一:委托实例m,哪里都可以用“+=”,“-=”,“=”三种方式,事件myEvent也可以用“+=”,“-=”,“=”三种方式,但是,事件的“=”必须要在申明他的类里面,才能用,外部,不能用,外部只需要关注注册“+=”和注销“-=”即可。因为外部如果可以用“=”,就会覆盖原有的其他注册进来的方法,这表明不安全,违背了封装性,外部的监听者,你只能管好自己是否监听,而不能因为你的监听误操作(“=”),覆盖了其他的未知监听者,所以在外部事件不允许用“=”。

第二:委托实例m,可以在任何地方调用,而事件myEvent,只能在申明他的类里面调用。这种限制,也是从面向对象的理念考虑。假设某个类(Class A)里面有一个事件,当这个类(Class A)的里面的某某属性(int b)发生了变化,然后发出通知,告诉所有的监听者。那么这个属性b,变没变,什么时候变,只能由A这个类自己知道,自己决定,自己触发,外部的任何类,无权过问,而委托的实例可以在任何地方调用,不符合这种封装性。

事件就是把委托实例的所有权利,都留给申明他的类,而只开放委托实例的注册和注销功能,给外部类。

事件最常用的场景,是用于广播变化给监听者,委托最常用的场景,是用于将方法当做参数进行传递(当然,委托也可以达到和事件一样的广播效果,不过没有事件那么安全)