常识点目录==========>传送门
首先保举两篇大牛写的委托和事件的博客,写的超级好!看了就包你看会,想学习的伴侣直接看这两篇就足以,我本身写的是算是本身学习的纪录。
传送门==========》C# 中的委托和事件 C# 中的委托和事件续。委托是什么?
委托是一个类,它界说了一种的类型,使得可以将要领看成另一个要领的参数来进行通报,这种将要领动态地赋给参数的做法,可以制止在措施中大量使用If-Else(Switch)语句,,同时使得措施具有更好的可扩展性。
--摘自百度百科。
说白了委托和我们平每每见的类是差不久不多的对象。它也是一个类型,一个东西。委托界说类似界说一种要领模板。满足于这个模板的任何要领都可以赋值于委托。并且将这个委托当参数进行通报,进而把要领当参数通报。
public delegate void deTest(string name);
这就界说个没有返回值的委托。界说委托需要关键字 delegate,这个关键字和我们界说的class关键字是一样的,记住是这样界说的就好了,下面部分就和界说要领的声明是一样的。去失delegate关键,就是和界说要领一模一样。
只要满足没有返回值,而且参数是string类型的参数的要领都满足于这个委托。都可以赋值绑定给这个委托。还是上面那句话.界说委托就即是声明了一个要领的模板。
接下来就演示下委托如何使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 委托和事件 { public delegate void deTest(string name); public class Test { public void SayHello(string name, deTest test) { test(name); } } }
首先看委托是界说在类外面的,说明界说类的处所都可以界说委托,委托和类是平级关系的。
Test类里面有个SayHello要领。这个要领有两个参数。一个就是string类型的参数,一个是委托类型的参数。委托类型的参数是什么意思呢?意思就是将满足委托模板的要领,将要领看成参数通报。因为没有委托要领是无非当参数通报的,最后SayHello要领里面挪用这个委托。因为这个委托参数自己也是要领。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 委托和事件 { class Program { static void Main(string[] args) { Test t1 = new Test(); deTest detest = SayHelloByEngilsh; t1.SayHello("小明",detest); } public static void SayHelloByEngilsh(string name) { Console.WriteLine(string.Format("Hello{0}", name)); } } }
首先我们有一个SayHelloByEnglish的要领。这个要领正好满足我们这个委托模板,无返回值,有一个string类型的参数。Main函数里将这个要领赋值于我们界说的委托。然后将这个委托通报到我们test的SayHello要领里面。
这个例子并不适合使用委托,不是一个好的使用委托的场景,在这里面写主要是为了大家了解委托如何创建使用。此刻我们在从头梳理一下。首先我们界说了一个Test类,在类里面有个SayHello要领。这个要领有两个参数对吧。
一个是string类型,一个是委托类型。要领面执行这个委托。因为委托自己就是绑定的要领,值就是要领,所以可以让要领直接挪用。接下来是main函数里面真正的挪用。将一个满足委托的要领赋值于委托,然后通报给了这个要领。最后要领内部执行的委托的时候,其实是执行了我们绑定的要领。也就是SayHelloTest。一个委托创建使用的demo就结束了。
总结下委托
委托赋值语发是+
绑定语法是+=
解绑语法是-=
下面来演示下委托的应用场景,此刻我们有个需求,有一个热水器,热水器连接着显示器,和报警器。热水器温度到达80°的时候,显示器就会显示提示,报警器就会报警。先用正常要领实现下。