首页 > 代码库 > 关于委托自己的一些理解(作为读书笔记)

关于委托自己的一些理解(作为读书笔记)

    以前提到委托,总感觉不好理解,简单意义是上说委托可以理解为函数的指针,可以把一个方法作为一个参数带入到另一个方法中。本人理解,请大牛指

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);        }    }}

运行结果如图:

 

以上理解为本人菜鸟级别的,望各位大牛指导教育,小弟愿意虚心学习!!非常感谢!!!