在面向对象的高级语言中,委托具有广泛的使用领域,当然在C#中,委托的使用方式与使用逻辑与其他编程语言相比大同小异,这里通过自学关于C#中委托的内容简略谈谈委托的使用语法与使用逻辑。
任何技术都是因需求而产生的,这里通过一个例子简单阐述委托需求的参数,以及在实现一个委托时,委托的定义,事件的定义,事件的订阅,传递参数,多播委托。首先说说委托需求的产生(在许多情况下都需要运用委托,书面上的定义不是显得太容易理解,这里以一幅图为例)。
可以将委托简单理解为上图所示,当员工做了某件事件时,这个时候,我们定义的某个委托监视到这个事件发生后,马上采取措施,可以想象成委托就是一个特殊的条件判断,只不过这里判断条件不是简单的if条件语句,而是某个具体事件的发生。
我们模拟办公室的这个情景。首先,创建一个Employee员工类,在员工类外定义一个委托public delegate void DelegateClassHandle()[委托的定义];并在员工类中创建一个委托事件PlayGame(监视员工是否玩游戏)[事件的定义],在员工类中还有一个玩游戏这个事件Game(),既然是在监视员工是否在玩游戏,那可以在员工玩游戏Game()这个方法中加入事件PlayGame()这个可以想象成一个监视器,一旦员工玩了游戏就会被他捕捉到,在定义委托事件PlayGame是没有括号的,而在使用时,后面别忘了带括号,这个是语法要求,当然也有很多简化的语法不过作为初学者掌握其最为通用的一类方法。具体代码如下:
1 public class Employee 2 { 3 public event DelegateClassHandle PlayGame;//声明委托类型的事件注意关键字 event 此时可将定义的委托名称DelegateClassHandle看作是一种类型 4 5 public void Game() 6 { 7 if(PlayGame!=null) 8 Console.WriteLine("我在玩游戏了"); 9 PlayGame();//此时这个事件后面要加括号(因为以后可以传递参数) 10 } 11 }
此时员工类我们定义好了。接下来按照上图所示,我们可以创建打小报告的Reporter类了,其实它要干的事情相当简单,只要发现有员工在玩游戏(即触发事件),那么就执行相应的代码。打小报告这个类代码如下:
1 public class Repoter//打小报告的类 2 { 3 public void Notify() 4 { 5 Console.WriteLine("报告老板,有人在玩游戏哦"); 6 } 7 }
这个时候,我们有委托了,也有委托事件了,也有触发委托事件的事件了,但是我们需要怎么将其关联起来?这个就需要[订阅事件]了。具体我们可以在“办公室”即Main()函数中实现。
1 static void Main(string[] args) 2 { 3 Employee e = new Employee(); 4 Repoter re = new Repoter(); 5 //指明玩游戏事件触发后,由谁的哪一个方法处理 6 e.PlayGame += new DelegateClassHandle(re.Notify);//输入方法的名称 注意“+=”这个符号代表由那个方法处理,可以有多个 同样也有“—=” 7 e.Game(); 8 Console.ReadKey(); 9 10 }
当一旦执行到e.Game()这行代码时,当执行到PlayGame事件时就会触发所委托的事件,并指明由哪一个方法进行处理。运行结果如下: