igaofen

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 
1.声明委托:委托是方法的签名,定义格式类似声明函数,如:public delegate string TestDelegate(string message);
 
2.实例化委托:实例化时,可以关联具有兼容签名的任何方法();
TestDelegate handler = DelegateMethod;
 
// 被关联的委托函数
string DelegateMethod(string message)
{
     return String.Format("DelegateMethod Return : {0}",message);
}
3.调用委托:委托会把此调用传递给与之关联的方法,并把函数返回值通过委托返回;
    Console.WriteLine(handler(testMessage));
 
4.传递委托:委托是一种数据类型,可以被实例化、可以被传递;委托是事件、异步回调的基础。
 
// 委托TestDelegate的实例化handler作为函数的入参
public void CallbackMethod(int param1, int param2, TestDelegate callback)
{
   string strDelegate =  callback("The number is: " + (param1 + param2).ToString());
   Console.WriteLine(strDelegate);
}
// 调用委托函数
MethodWithCallback(1, 2, handler);
 

输出结果:DelegateMethod Return : The number is: 3

 

 

   // 在包或类里声明委托
    public delegate void TestDelegate(Object sender, TestEventArgs e);

    /*
     * 事件发送者(EventSender):定义委托实例(TestEvent)与委托的调用函数(SendEvent)   
     * 委托的调用函数就是发送委托
     *
     * 事件的订阅者(EventOrder):在事件发送者实例中注册(注册还是监听不确定),接收事件发送者发出的委托,并实例化这个委托
     *
     * 触发事件:调用事件发送者的发送函数
     *
     * this.Button1.Click += new System.EventHandler(this.Button1_Click);
     *
     * private void Button1_Click(object sender, System.EventArgs e)
     * {
     *     // do smoething
     * }
     *
     * 声明委托对象并通过event关键字来引用该委托对象
     * System.EventHandler相当于事件发送者,EventSender,Button1_Click相当于DelegateWorkFun。
     *
    */


    /// <summary>
    /// 事件的发送者
    /// </summary>
    public class EventSender
    {
        // 通过委托定义事件(委托实例)
        public event TestDelegate TestEvent;

        // 发送事件(发送了一个委托实例)
        public void SendEvent(TestEventArgs e)
        {
            if (TestEvent != null)
            {
                TestEvent(this, e);
            }
        }
    }

    /// <summary>
    /// 事件的订阅者
    /// </summary>
    public class EventOrder
    {
        public EventOrder(EventSender eventSender)
        {
            // 关联事件的处理函数(实例化委托即关联委托实例与委托函数)
            eventSender.TestEvent += new TestDelegate(DelegateWorkFun);
        }

        // 事件的处理函数(委托实例关联的函数)
        public void DelegateWorkFun(Object sender, TestEventArgs e)
        {
            Console.WriteLine("room {0},ferocity {1}", e.room, e.ferocity);
        }
    }

    /// <summary>
    /// 事件参数
    /// </summary>
    public class TestEventArgs : EventArgs
    {
        public TestEventArgs(string room, int ferocity)
        {
            this.room = room;
            this.ferocity = ferocity;
        }

        public string room;
        public int ferocity;

    }

事件与委托示例下载

posted on 2009-10-27 15:55  igaofen  阅读(291)  评论(0编辑  收藏  举报