C# 委托使用举例

委托允许用户将自己的方法与委托实例关联起来,从而在委托被调用时执行自己的方法。常被用来作为回调函数、固定逻辑中的可变处理过程方法。

1. 委托实现回调函数举例

        //define callback delegate 
        public delegate void CallBack(string result);
        //process method
        public void Processer(string args, CallBack resultHandle)
        {
            //get result...
            string result = "args is" + args;

            //handle the result
            resultHandle(result);
        }
        //handel the result
        public void DisplayResult(string result)
        {
            Console.WriteLine(result);
        }

        //callback delegate example
        public void Main()
        {
            Processer("待处理数据", new CallBack(DisplayResult));
        }

本例中包含四个简单的步骤:

1. 定义了委托CallBack,用于包装一个方法作为回调函数。
2. 定义了一个处理方法Processer,代表一个处理过程。该处理过程第一个参数是要处理的数据,第二个参数是用于接收处理结果的回调函数。

3. 定义回调的具体方法DisplayResult,该方法参数和返回值要与委托CallBack保持一致。

4. 定义具体的应用代码Main,该方法调用处理过程Processer,让其处理“待处理数据”,并将处理结果交给委托对象 new CallBack(DisplayResult),这样DisplayResult包装在委托对象中,传递给了Processer的回调参数resultHandle。在Precesser处理完成之后,调用resultHandle(result);此时委托对象就委托DisplayResult方法来完成结果的显示工作。

当然,如果将委托中包装的方法换成一个新方法PrintResult,也可以实现将处理结果通过打印机打印出来。这就是一个委托做回调的简单应用。确实很有魅力-_-

 

2. 委托分离固定逻辑中的可变处理过程示例

 本例中主要演示通过委托SyncSignalProvider实现对变化部分的分离,降低代码的耦合度。

       public delegate bool SyncSignalProvider();
        //get syncsignal by auto mode 
        public bool GetSyncAuto()
        {
            //自动产生同步信号
            return true;
        }
        //get syncsignal by manul mode
        public bool GetSyncManul()
        {
            //手动产生同步信号
            return false;
        }
        //固定逻辑
        public void RefreshSyncSignal(SyncSignalProvider getSyncSignal)
        {
            bool sync = getSyncSignal();
            if (sync)
            {
                //do something...
            }
            else
            {
                //do others...
            }
        }

        //委托分离变化示例
        public void TestDelegate()
        {
            RefreshSyncSignal(new SyncSignalProvider(GetSyncAuto));
        }

本例中同样包含四个步骤:

1. 定义了委托SyncSignalProvider,用于包装提供同步信号的不同方法;本委托有bool类型返回值,表示同步信号的True、False(模拟高低电平)。

2. 定义了两个停工同步信号的方法GetSyncAuto/GetSyncManul,它们分别以自动和手动的方式提供同步信号(bool类型的返回值)。

3. 定义包含固定逻辑的方法RefreshSyncSiganl,方法接收一个同步信号提供委托getSyncSiganl。该方法根据同步信号的不同执行两个分支的操作,而这两个分支内的逻辑是固定的;可变部分是同步信号的获取方式(通过委托传递进来,这样将变化分离了出去,由调用者管理变化)。

4. 定义具体的应用代码TestDelegate,该方法调用RefreshSyncSiganl,让其根据委托对象 new SyncSignalProvider(GetSyncAuto)提供的同步信号获取方法GetsyncAuto来获取同步信号,进而完成固定逻辑。

当然,如果调用者因为停电等原因必须手动提供同步信号时,只需要为RefreshSyncSiganl方法传递包装GetSyncManul的委托就可以了,就可以避免修改RefreshSyncSiganl方法。

这就是借助委托实现软件设计优化(封装、分离变化)的一个小示例。

posted on 2013-05-21 21:18  marshal-m  阅读(1031)  评论(1编辑  收藏  举报

导航