c#笔记04-委托 事件

来源:互联网 发布:live800服务端源码 编辑:程序博客网 时间:2024/06/06 03:48


有如下示例:
    委托  -- 基本使用
    事件 委托 --发送无参数消息
    事件 委托 --发送有参数消息
    事件 委托 --传递方法的方法
张永辉 2012年11月9日
----------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace cs1
{
    //--------------------Delegate 委托-------------------------------------------------------------
    //Delegate它实际上是一个能够持有对某个方法的引用的类,
    //delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".类似指针,能够指向非静态的指针。
    class class4
    {
        public delegate void MyDelegate(string name);       //声明 MyDelegate() 一个委托

        public static void MyFun0(string name)              //被委托的方法0,它与MyDelegate具有相同的参数和返回值类型
        {
            Console.WriteLine("MyFun 0: " + name);
        }
        public static void MyFun1(string name)              //被委托的方法1
        {
            Console.WriteLine("MyFun 1: " + name);
        }
    }
    class key_delegate
    {
        public key_delegate()
        {
            Console.WriteLine("key_delegate================");
            //创建委托对象
            class4.MyDelegate mdf = new class4.MyDelegate(class4.MyFun0);

            mdf("123");             //调用到委托 class4.MyFun0
            class4.MyFun0("456");   //直接调用函数

            mdf = class4.MyFun1;    //更改委托
            mdf("789");
        }
    }

    //--------------------事件 委托 发送无参数消息--------------------------------------------------
    //事件触发器  参考
http://blog.csdn.net/jamestaosh/article/details/4372172
    class Dog
    {
        //1.声明关于事件的委托
        public delegate void AlarmEventHandler(object sender, EventArgs e);
        //一般的事件处理程序接受两个参数,一个是事件的发送者sender,一个是事件参数e 。用于在发送者和接收者之间传递信息

        //2.声明事件  将创建的委托和特定事件(Alarm)关联  (需要向Alarm添加事件)
        public event AlarmEventHandler Alarm;

        //3.编写引发事件的函数  调用此函数会引发事件
        public void OnAlarm()
        {
            if (this.Alarm != null)                 //事件不是空才能调用
            {
                Console.WriteLine("狗报警: 有小偷进来了,汪汪~~~~~~~");
                this.Alarm(this, new EventArgs());  // 触发事件
            }
        }
    }

    //事件接收者
    class Host
    {
        //4.注册事件处理程序
        public Host(Dog dog)
        {
            //产生一个委托实例并添加到dog.Alarm产生的事件列表中
            dog.Alarm += new Dog.AlarmEventHandler(HostHandle);
        }

        //5.事件处理程序
        void HostHandle(object sender, EventArgs e)
        {
            Console.WriteLine("主  人: 抓住了小偷!");
        }
    }

    class key_event
    {
        public key_event()
        {
            Console.WriteLine("key_event===================");
            //场景:狗发现小偷并报警, 主人处理报警
            Dog dog = new Dog();            //实例化一个事件发送器
            Host host = new Host(dog);      //实例化一个事件接收器
            dog.OnAlarm();                  //触发事件
        }
    }

    //事件抽象总结如下:C#中事件产生和实现的流程:
    //1. 定义A为产生事件的实例,a为A产生的一个事件
    //2. 定义B为接收事件的实例,b为处理事件的方法
    //3. A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件)
    //4. A通过事件列表中的委托对象将这个事件通知给B
    //5. B接到一个事件通知(实际是B.b利用委托来实现事件的接收)
    //6. 调用B.b方法完成事件处理
    /*public class A
    {
        public delegate void EventHandler(object sender);
        public event EventHandler a;

        public void Run()
        {
            Console.WriteLine("Trigger an event.");
            a(this);
        }
    }
    class B
    {
        public B(A a)
        {
            a.a += new A.EventHandler(this.b);
        }
        private void b(object sender)
        {
            Console.WriteLine("Received and handled an event.");
            Console.Read();
        }
    }*/

    //--------------------事件 委托 发送有参数消息--------------------------------------------------
    //事件参数
    public class EventArgsParameter : EventArgs
    {
        public int numberOfThief;
        public EventArgsParameter(int number)       //构造函数
        {
            numberOfThief = number;
        }
    }

    //事件触发器
    class Dog1
    {
        //1.声明关于事件的委托                            无参数[..., EventArgs e)]
        public delegate void AlarmEventHandler(object sender, EventArgsParameter e);

        //2.声明事件
        public event AlarmEventHandler Alarm;

        //3.编写引发事件的函数 无参数[(EventArgs e)]
        public void   OnAlarm(EventArgsParameter e)
        {
            if (this.Alarm != null)
            {
                Console.WriteLine("狗报警: 有小偷进来了,汪汪~~~~~~~");
                this.Alarm(this, e);  // 触发事件  无参数[ this.Alarm(this, new EventArgs()); ]
            }
        }
    }

    //事件接收者
    class Host1
    {
        //4.注册事件处理程序
        public Host1(Dog1 dog)
        {
            //产生一个委托实例并添加到dog.Alarm产生的事件列表中
            dog.Alarm += new Dog1.AlarmEventHandler(HostHandle);
        }

        //5.事件处理程序            无参数[..., EventArgs e)]
        void HostHandle(object sender, EventArgsParameter e)
        {
            Console.WriteLine("主  人: 抓住了{0}个小偷!", e.numberOfThief);
        }
    }

    class key_event1
    {
        public key_event1()
        {
            Console.WriteLine("key_event1==================");
            //场景:狗发现小偷并报警, 主人处理报警
            Dog1 dog = new Dog1();            //实例化一个事件发送器
            Host1 host = new Host1(dog);      //实例化一个事件接收器
            EventArgsParameter e = new EventArgsParameter(3); //无参数[]
            dog.OnAlarm(e);                  //触发事件 无参数时此句的写法[dog.OnAlarm(e);]
        }
    }
    //--------------------事件 委托 传递方法的方法--------------------------------------------------
    //场景:向英国人打招呼用英语 向中国人打招呼用中文

    //定义委托,它定义了可以代表的方法的类型
    class moring
    {
        public delegate void GreetingDelegate(string name); //定义委托,它定义了可以代表的方法的类型

        public  void EnglishGreeting(string name)    //方法1
        {
            Console.WriteLine("Morning, " + name);
        }

        public  void ChineseGreeting(string name)    //方法2
        {
            Console.WriteLine("早上好,  " + name);
        }

        //注意此方法,它接受一个GreetingDelegate类型的方法作为参数
        public  void GreetPeople(string name, GreetingDelegate Greeting)
        {
            Greeting(name);
        }
    }

    class key_delegatefun
    {
        public key_delegatefun()
        {
            Console.WriteLine("key_delegatefun=============");
            moring Gp = new moring();
            Gp.GreetPeople("Jimmy Zhang", Gp.EnglishGreeting);
            Gp.GreetPeople("张子阳", Gp.ChineseGreeting);

            moring.GreetingDelegate delegate1;
            delegate1 = Gp.EnglishGreeting;    // 先给委托类型的变量赋值
            delegate1 += Gp.ChineseGreeting;   // 给此委托变量再绑定一个方法
            Gp.GreetPeople("zyhui", delegate1);

        }
    }

    //----------------------主进程------------------------------------------------------------------
    class Program
    {
        static void Main(string[] args)
        {
            key_delegate k4 = new key_delegate();
            key_event1 k5 = new key_event1();
            key_delegatefun k7 = new key_delegatefun();
            key_event k6 = new key_event();

            Console.Read();
        }
    }
}

 

 

原创粉丝点击