首页 > 代码库 > 关于委托自己的一些理解(作为读书笔记)
关于委托自己的一些理解(作为读书笔记)
以前提到委托,总感觉不好理解,简单意义是上说委托可以理解为函数的指针,可以把一个方法作为一个参数带入到另一个方法中。本人理解,请大牛指
1.首先看一个简单的例子
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DelegateDemo{ public class Program { //声明一个猫叫,处理主人醒,老鼠跑 //public delegate void MyEventHandle(); public delegate string MyDelegate(string name, int age); static void Main(string[] args) { //第一种方式:作为被委托调用的方法,声明为静态方法是可以调用; MyDelegate md = new MyDelegate(show); } private static string show(string name, int age) { return "你的名字是:" + name + "你的年龄是:" + age; }
首先声明一个委托Mydelegate,当show方法需要被委托是,new一个委托对象md,md就可以作为show方法的代表,md(“liupeng”,23)来处理事情。此时注意的是show方法声明的为静态方法。
运行结果如图:
那么,不声明为静态的方法能否调用了?答案是当然可以,这就是委托给我们带来的好处。此时通过对象也可以调用非静态的方法。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DelegateDemo{ public class Program { public delegate string MyDelegate(string name, int age); static void Main(string[] args) { //第二种方式:不是声明为静态的方法,作为参数被委托调用是需要实例化对象才可以被调用 Program pg = new Program(); MyDelegate md1 = new MyDelegate(pg.show1); Console.WriteLine(md1("liupeng", 23)); Console.ReadKey(); } private static string show(string name, int age) { return "你的名字是:" + name + "你的年龄是:" + age; } private string show1(string name, int age) { return "Hello" + name + "你的年龄是:" + age + "你已经成年啦!"; } }
运行结果如图:
如此这是基本的委托实例。下面来看看较为经典的一道面试题目:简单说是,猫叫,主任醒,老鼠跑。(要求考虑到彼此间的连锁反应)
1.首先猫叫,引起主人醒和老鼠跑同时发生,那么就要求能够同时处理这两个事件,就好比今天项目经理要求你去见客户,但是你今天又有开发任务要完成,这两件事情必须完成,你只能处理一件事情,要想都办理,那么就得委托同时帮忙处理,所以委托也可以这么理解:当要处理的时间同时发生时,可以用委托去处理。(如有不当之处,请大牛指正,感谢!)
2.有了分析之后,那么就可以开始coding啦,三个类Cat 、Mouse、Person是所必需的,在Cat类里面声明委托的变量,定义Cat的行为:猫叫(CatCry()方法),自此分别在Mouse类、Person类中定义各自的行为,其中关键的一点就是把三种行为委托到Cat对象进行处理,cat对象调用委托方法处理传递进来的行为参数(各自的ACtion)
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DelegateDemo{ public class Program { //声明一个猫叫,处理主人醒,老鼠跑 public delegate void MyEventHandle(); static void Main(string[] args) { //猫叫处理一系列反应 Cat cat1 = new Cat(); Mouse mouse = new Mouse(cat1); Person person = new Person(cat1); cat1.CatCry();//调用猫叫方法,引起连锁反应 Console.ReadKey(); } //关于面试的一道经典题目,猫叫,主人醒,老鼠跑 //猫叫引起主人醒和老鼠跑,同时发生。 public class Cat { public event DelegateDemo.Program.MyEventHandle eHandle; public void CatCry() { Console.WriteLine("睡了一觉,是时候工作啦抓老鼠啦!"); if (eHandle != null) { eHandle(); } } } public class Mouse { public void Run() { Console.WriteLine("兄弟们,黑猫醒啦,我们该逃跑啦!!Come On!"); } public Mouse(Cat cat) { cat.eHandle += new Program.MyEventHandle(Run); } } public class Person { public void Wake() { Console.WriteLine("好烦人的黑猫,睡个觉都被吵醒啦!"); } public Person(Cat cat) { cat.eHandle += new Program.MyEventHandle(Wake); } }}
运行结果如图:
以上理解为本人菜鸟级别的,望各位大牛指导教育,小弟愿意虚心学习!!非常感谢!!!