委托和事件

class Program
    {
        public delegate void CatcallEventHandler();
        public delegate void mouserunEventHandler();

        //猫这个类里声明一个事件 (事件是需要委托的)
        //事件的触发是需要Invoke
        public class Cat
        {
            //事件要依靠 委托  事件在类中声明且生成
            public event CatcallEventHandler catcall;
            public void OncatCall()
            {
                Console.WriteLine("猫叫了一声");
                catcall.Invoke();//这个Invoke是事件的调用
            }
        }

        public class Mouse
        {
            public event mouserunEventHandler mousecall;
            public void MouseRun()
            {
                Console.WriteLine("老鼠跑了");
                mousecall.Invoke();
            }
        }

        public class People
        {
            //定义主人醒来方法
            public void WakeUp()
            {
                Console.WriteLine("主人醒了");
            }
        }

        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Mouse m = new Mouse();
            People p = new People();
//catcall 是事件,是猫的这个事件引发下一个事件 cat.catcall += new CatcallEventHandler(m.MouseRun); //因为在这里 触发了m.MouseRun 而且m.MouseRun又触发了 mousecall.Invoke(); 然后又触发了下面的p.wake //这就是为什么老鼠跑了,主人醒了 m.mousecall += new mouserunEventHandler(p.WakeUp); cat.OncatCall(); m.MouseRun(); Console.ReadKey(); } }

 static void Main(string[] args)
        {
            TestA a = new TestA();
            TestB b = new TestB(a);
            //5.事件的触发:在代码中就是a.Do("a", "b");这一句。通过代码发现,a.Do("a", "b")实际上是调用了对象b中的OnGetStr方法,
            //所谓的事件“订阅”相当于是把符合委托“模板”的方法OnGetStr传递过去,最终执行的是OnGetStr方法。这样的语言描述可能不准确,得多体会才行。
            a.Do("a", "b");//事件的触发
            Console.ReadKey();
        }


        //1.首先定义一个委托类型:void GetStrHandler(string x, string y),为事件的声明作准备。
        public delegate void GetStrHander(string x, string y);
        //2.定义事件拥有者的类,即class TestA,事件拥有者是这个类的实例对象即TestA a = new TestA();中定义的a。
        //因为事件GetStr,是在TestA这个类中定义的,也就是事件的拥有者。
        public class TestA
        {
            //事件类型与委托一起  GetStr最终还是一个事件,闪电符号
            //声明事件
            public event GetStrHander GetStr;
            public void Do(string x, string y)
            {
                GetStr(x, y);
            }
        }

        //3..定义事件订阅者的类,即class TestB ,事件拥订阅者是这个类的实例对象即TestB b = new TestB(a);中定义的b,
        //仔细看看TestB的构造方法,发现它依赖于对象a,这是因为订阅者需要监听事件拥有的事件(这句的"监听"也就是当TestA有啥动静,这边及时作出反应),
        //因此需要把事件拥有者“引”进来,使订阅者能实现事件订阅
        public class TestB
        {
            private TestA _A;
            public TestB(TestA a)
            {
                _A = a;
                _A.GetStr += OnGetStr;//事件的订阅
                _A.GetStr += onGetStr2;//后面再追加一个订阅,也就是多播委托
            }
            //4.定义事件处理方法:在三要素中已强调过,事件处理方法是在订阅者中定义的,表示事件触发时需要执行的方法。
            //这里就是执行了“Console.WriteLine(string.Format("{0}+{1}", x, y));”这个动作。
            private void OnGetStr(string x, string y)
            {
                Console.WriteLine(string.Format("{0}+{1}", x, y));
            }

            public void onGetStr2(string x, string y)
            {
                Console.WriteLine(string.Format("{0}-{1}", x, y));
            }
        }
人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。
原文地址:https://www.cnblogs.com/ZkbFighting/p/15044674.html