C#中的委托与事件

概念

委托

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。委托用于将方法作为


参数传递给其他方法。在方法重载的上下文中,方法的签名不包括返回值。但在委托的上下文中,签名的确包括返回


值。换句话说,方法和委托必须具有相同的返回值。


委托的声明

	public delegate void EventHandler();		//无参数,无返回值

事件


事件则是委托的一种特殊形式,发生有意义的事情时,事件对象处理通知过程。或对象可以通过事件向其他类


或对象通知发生的相关事情。 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。



事件的声明

	public event EnentHandler Update ;		//声明一个“EventHandler”的委托事件

委托和事件的使用

  //通知者接口
    interface Subject
    {
        void Notify();
        string SubjectState
        {
            get;
            set;
        }
    }
    //StockObserve类
    class StockObserver
    {
        //构造函数对StockObserver类进行赋值 
        private string name;
        private Subject sub;
        public StockObserver(string name, Subject sub)
        {
            this.name = name;
            this.sub = sub;
        }
        //方法“通知”
        public void CloseStockMarket()
        {
            Console.WriteLine("{0}{1}关闭股票软件,赶快假装工作!",sub.SubjectState ,name );
        }
    }
//看NBA直播的同事
    class NBAObserver
    {
          //构造函数对StockObserver类进行赋值 
        private string name;
        private Subject sub;
        public NBAObserver(string name, Subject sub)
        {
            this.name = name;
            this.sub = sub;
        }
        //方法“通知”
        public void ShutDownNBADirect()
        {
            Console.WriteLine("{0}{1}关闭NBA直播,赶快假装工作!",sub.SubjectState ,name );
        }
    }
   
   
    //声明委托
    delegate void EventHandler();
    //boss类
    class Boss : Subject
    {
        //声明一个事件Update,类型为委托EventHandler
        public event EventHandler Update ;

        private string action ;     //用于记录前台状态的变量

        public void Notify ()
        {
            Update ();                  //在访问方法“Notify”时,调用update 事件
        }

        //返回和对前台状态进行读写
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }
    //Secretary类
    class Secretary : Subject
    {
        //声明一个事件Update,类型为委托EventHandler
        public event EventHandler Update;

        private string action;     //用于记录前台状态的变量

        public void Notify()
        {
            Update();                  //在访问方法“Notify”时,调用update 事件
        }

        //返回和对前台状态进行读写
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }


客户端代码

static void Main(string[] args)
        {
            //老板陈
            Boss chen = new Boss();

         
            StockObserver  tongshia = new StockObserver("陈易得",chen );
            NBAObserver tongshib = new NBAObserver("陈德清",chen );


           chen.Update +=new EventHandler(tongshia.CloseStockMarket );
           chen.Update += new EventHandler(tongshib.ShutDownNBADirect );

            //老板chen回来了
            chen.SubjectState = "老板chen回来了!!!!";
            //发出通知
            chen.Notify();

        }



通过 委托EventHandler将,将“看股票者(stockobserver)”的closestockmarket方法挂钩到老板的更新上,同时将Shu


tDownNBADirect的方法挂钩到update上,也就是将两个不同类的不同方法委托给老板类的更新了。


委托具有以下特点:


委托类似于 C++ 函数指针,但它们是类型安全的。


委托允许将方法作为参数进行传递。


委托可用于定义回调方法。


委托可以链接在一起;例如,可以对一个事件调用多个方法。


方法不必与委托签名完全匹配。


posted @ 2013-02-07 18:47  陈方林  阅读(190)  评论(0编辑  收藏  举报