我自己,对于C#中的委托的机制,一直是在摸索着前行,对于这个机制每次使用都会加深一点对这个机制的理解。我就简单的说说我对这个机制的理解,首先需要订阅委托,当触发调用委托,回调函数就会响应被触发的委托。如代码所示:
public partial class Form1 : Form
{
//订阅次数
static int count;
//回调函数执行次数
static int num;
public Form1()
{
InitializeComponent();
}
#region 一般情况下,委托的定义会封装在一个类里面,只提供函数的接口。
//定义一个委托,为回调函数创建一个协议。
public delegate void OnComplete(int i);
//创建委托对象
public OnComplete m_OnComplete = null;
//一般情况下这个函数接口封装在一个类里面,对外只提供这个函数的接口。
public void ShowResult(OnComplete onComplete)
{
//先卸载响应方法,确保回调函数只执行一次
//m_OnComplete -= onComplete;
//为委托新增响应处理方法
m_OnComplete += onComplete;
}
//触发
private void button1_Click(object sender, EventArgs e)
{
//调用委托对象
if (m_OnComplete != null)
{
m_OnComplete(count);
}
}
#endregion
//响应触发的回调函数
private void Complete(int i)
{
num++;
Console.WriteLine("订阅"+i+"次。"+"触发完成,回调了"+num+"次\r\n");
}
//订阅
private void button2_Click(object sender, EventArgs e)
{
count++;
ShowResult(Complete);
}
当我多次订阅委托时,我触发调用委托之后,回调函数就会被执行多次。执行结果如下图所示。
在有些情形下,我需要确保回调函数只被执行一次,即,我只需要订阅一次,我的思路是,在每次为委托新增方法前先卸载该方法。只需把上面的代码加上一行。如下图所示:
当我多次去执行订阅的过程,但实际上,我只订阅了一次委托,所以回调函数只执行一次。运行结果如下图所示:
以上就是一些自己的理解,实力尚浅,如果有理解错误的地方,还请大牛不啬赐教,在此表示感谢。