在C#中委托作为一种类似于C++中函数指针的数据类型,允许开发开发人员将方法本身作为参数进行传递,极大地增加了函数功能的灵活性与可组装型。在C#中委托的实现方式,依据所使用的语法糖程度通常分为以下四种,在绝大部分的C#开发书籍中都只介绍了“委托申明+方法绑定”的基础调用形式,而在实际开发中,为了起到简化代码编写目的,常常使用其余三种方式,因此,本文对常用三种方式的特点进行了整理,并给出了使用Demo。
此种方式最为传统,写法最为复杂,没有多余的语法机制,比较方便理解。具体的操作流程为
graph LR
申明委托-->定义方法
定义方法-->创建委托对象并绑定方法
创建委托对象并绑定方法-->执行委托对象
注意:该种方式由于执行方法被分装在委托对象中,因此只能通过委托对象.invoke方法进行方法的调用
//声明委托
private delegate void Del_UpDateWaitFormDialog(WaitDialogForm dialog,int current,int count);
//定义方法,即过程的执行体是一个方法,且有明确的方法名
private void UpDateWaitFormDialog(WaitDialogForm dialog,int current,int count)
{
string.Format("正在进行,已经完成 {0} / 10 ", (current + 1), count)
}
//方法绑定
Del_UpDateWaitFormDialog UpDateWaitFormDialog1= new Del_UpDateWaitFormDialog(UpDateWaitFormDialog);
//其后可以如下执行方法,或者将其传递到需要使用委托的的方法中
UpDateWaitFormDialog1.invoke(实参列表);
此种方式最大的特点在于,委托中执行的方法由delegate修饰因而没有方法名
graph LR
申明委托-->定义匿名方法
定义匿名方法-->执行匿名方法
注意:该种方式的委托名就是访问执行体的唯一途径,非常类似于C++中的函数指针
//声明委托
private delegate void Del_UpDateWaitFormDialog(WaitDialogForm dialog,int current,int count);
//定义匿名方法,即过程的执行体是一个方法,但是没有方法名
Del_UpDateWaitFormDialog UpDateWaitFormDialog1 = delegate(WaitDialogForm dialog,int current,int count)
{
string.Format("正在进行,已经完成 {0} / 10 ", (current + 1), count)
}
//其后可以如下执行方法,或者将其传递到需要使用委托的的方法中
UpDateWaitFormDialog1(实参列表);
此种方式与匿名委托没有太大差异,只是匿名委托的创建形式改为lambda表达式
graph LR
申明委托-->定义Lambda表达式
定义Lambda表达式-->Lambda表达式
注意:该种方式的委托名就是访问执行体的唯一途径,非常类似于C++中的函数指针
//声明委托
private delegate void Del_UpDateWaitFormDialog(WaitDialogForm dialog,int current,int count);
//定义匿名lambda,即过程的执行体是lambda,且没有方法名
//由于执行体只有一行,因此可以删除花括号
Del_UpDateWaitFormDialog UpDateWaitFormDialog1 = (WaitDialogForm dialog,int current,int count) =>
string.Format("正在进行,已经完成 {0} / 10 ", (current + 1), count)
//其后可以如下执行方法,或者将其传递到需要使用委托的的方法中
UpDateWaitFormDialog1(实参列表);
//直接定义无返回值类型的泛型委托Action
//由于
Actionint, int> updateaction = (dialog, current, count) =>
dialog.Caption = string.Format("正在进行,已经完成 {0} / 10 ", (current + 1), count);
//直接定义有返回值类型的泛型委托Action
Funcint, int,int> updateaction = (dialog, current, count) =>
{
dialog.Caption = string.Format("正在进行,已经完成 {0} / 10 ", (current + 1), count);
return 100;
}