Unity和C#的委托与事件的个人笔记

基本的自定义委托形式:

Public   delegate  void  Delegate(){

}

委托是一种引用类型的类。类似cpp函数指针。委托的基础使用就是快速去间接调用某些方法。

C#system库自带委托:

Action 委托无返回值(void)

Func    委托必须有返回值。

委托的常用在作为参数传入某个方法,同时在委托里面间接调用其他方法。实现多方法的快速耦合。

缺点:

委托的多播会造成内存泄漏:委托会引用一个方法,如果这个方法是一个实例方法(非静态方法)的话,那么这个方法必须隶属于一个对象,拿一个委托引用这个方法,那么这个对象必须存在在内存中,即便没有其他引用变量引用这个对象了,这个对象的内存也不能被释放,因为一旦释放,内存就不能再间接调用对象的方法了。  Memory leak

多播委托同样在维护上存在一定的困难性,容易导致所有的方法重置,完全性降低。(使用事件来作为委托类型字段的封装器。)

嵌套调用可读性差

.NET规定,声明事件的委托的命名格式采用 事件名称加EventerHandle这一后缀命名。事件的命名要加上后缀EventArgs,自定义事件要继承自EventArgs。

事件的本质就是委托字段的包装器。

Public EventHandler onorder;这是一个委托类型的字段。

Public event EventHandler onorder ;这是一个事件,只能以-=或者+=访问事件,添加事件处理器的订阅和删除。简略的声明格式容易造成误导,实际上事件并非委托类型的字段或者特殊的委托类型,它是委托的包装器。

PS:判断事件是否为空可以使用!=(语法糖)。

完整声明格式:

Private EventHandler orderEventHandler;

Pubic event EventHandler Onorder{

  add{

          orderEventHandler+=value;

   }

   remove {

           orderEventHandler-=value;

    }

}

事件就是用来阉割委托实例的,事件只能add,remove事件处理器,不能赋值,并且事件只能+=,-=,不能=,不能外部触发事件。

在实际项目中,我们常常会利用事件来降低代码之间的耦合度,同时避免重复的编写多种较为通用的方法,减少工作量。

后记:算是个人对最近的唐山事件的感慨,希望大家能够将性别对立,女权,性骚扰,黑社会,暴力斗殴这些因素看得更加深刻一点,有自己的思考。希望这次事件中的受害人能够被大家关照,也希望不法分子能得到制裁,同时也始终希望广大的网友可以更加理智。

猜你喜欢

转载自blog.csdn.net/qq_62440805/article/details/125242794