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 阅读(1037) 评论(1) 编辑 收藏 举报