一、定义
C#中的委托(Delegate)是存有对某个方法的调用的引用类型的变量。引用可在运行时被改变。委托(Delegate)特别被用于实现事件和回调方法。所有的委托(Delegate)都派生之System.Delegate类。
二、解释举例
在开发WinForm程序时经常会有添加员工信息的这样一种功能,我们一般都会创建一个界面用于展示所有的员工信息,这个界面会有一个“新增”的功能,一般都是打开一个模式窗口用于添加员工信息,只有在关闭子窗体时,我们会返回一个Ture或False,告诉信息展示窗体是否添加了新员工,若是则刷新员工列表,没有则信息保持不变。
这时候的代码是这样的(如下):
private void AddNewUserInfo_Click(object sender, EventArgs e)
{
//通过构造方法进行初始化(此时,通过特殊渠道进入子窗体内部)
FrmAddNewInfo uAdd = new FrmAddNewInfo ();
if(uAdd.LoadFrmAddNewInfo())
{
ReFreshUserList();//必须等到子窗体关闭才能调用
}
}
private void ReFreshUserList()
{
//刷新用户信息列表
}
这个功能里面有一个问题,如果用户一次性录入10个员工的信息,在录入第N个的时候,由于接了个电话,等在重新录入的时候忘记了自己刚才录入到第几个了,这个时候只有关闭“新增”窗体,才能看到已经录入的信息,那怎么在录入的同时就让信息展示列表刷新,而不必等到关闭再刷新列表。
而委托(Delegate)就可以解决这个问题,代码示例如下:
//首先定义一个委托(定义的委托必须和要绑定的方法具有相同类型、数量的参数)
public delegate void MyDel();
private void AddNewUserInfo_Click(object sender, EventArgs e)
{
//将方法ReFreshUserList绑定给定义好的委托
MyDel mdel=ReFreshUserList;
//通过构造方法进行初始化(此时,将委托送入入子窗体内部)
//也可以理解为派出一个间谍进入敌人内部
FrmAddNewInfo uAdd = new FrmAddNewInfo (mdel);
uAdd.ShowDialog();
}
private void ReFreshUserList()
{
//刷新用户信息列表
}
---------子窗体中的代码------------
//在子窗体中定义一个委托,用于接收传过来的委托
//给派过来的间谍,在敌人内部安排一个合法身份
private MyDel mdl;
public FrmAddNewInfo (MyDel mdel):this()//子窗体初始化
{
this.mdl = mdel;//派出的间谍获取合法活动身份
strCgXx = str;
}
private void AddUserInfo()
{
//添加信息成功后
//实现委托(间谍将获取的数据传回)
//将在此处实现父窗体的ReFreshUserList()l
mdl();
}