1、了解委托(delegate)
* 委托是一种全新的面向对象语言特性,运行于.NET平台
*基于委托开发事件驱动程序变得简单
*使用委托可以大大简化多线程编程的难度
2、理解委托
*委托(delegate)可以看成是一种数据类型,它可以定义变量,不过是一种特殊的变量。
*委托定义的变量,可以接受的数值是一个或多个方法,可以理解成它是存放方法的变量,或理解成委托就是一个方法指针。
3、委托的使用方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Csharp控制台练习{
class Program
{
//【1】、声明委托 (定义一个函数的原形:返回值+参数类型和个数)
public delegate int DemoDelegate(int a, int b);
//【2】、要存放的方法等具体实现功能(比如加减法)
static int Add(int a, int b) { return a + b; }
static int Sub(int a, int b) { return a - b; }
static void Main(string[] args)
{
//【3】、定义委托变量,并且关联要存放于该变量的方法
DemoDelegate objDel = new DemoDelegate(Add);
//【4】、通过委托调用方法,而不是直接调用方法
Console.WriteLine( objDel(10, 20));
objDel -= Add;
objDel += Sub;
Console.WriteLine( objDel(10, 20));
Console.ReadKey();
}
}
}
此程序输出结果为30 -10.
使用委托的步骤:
1、声明委托:关键字delegate + 返回值 +委托名 +参数 。 返回值和参数怎么确定? 当然是要和存放的方法类型要一致了
2、委托对象的定义。
3、将委托与方法关联起来,除了在创建对象的时候关联方法也可以通过 “ += " 绑定方法,也可以通过 ”-=“ 方法解绑 来实现方法的关联。
4、通过委托调用方法。
以上就是委托关联方法的具体步骤。但是上述代码并不能体现委托的真正用处。本来用方法就能实现的功能,搞得那么复杂不是闲得慌?
委托的用途十分多,其中一个就是可以实现窗体之间的通信,或者说是数据传递。现在要实现下述功能:有多个窗体,一个是主窗体,和其他是从窗体,主窗体中有一个单击按钮,而在每个从窗体中同步显示单击按钮的次数。要知道,一个窗体无法直接调用另一个窗体的方法,也无法直接操作另一个窗体的控件属性,通过委托便可以实现。
1、从窗体代码(frmOther1.)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Csharp窗体练习
{
public partial class frmOther1 : Form
{
public frmOther1()
{
InitializeComponent();
}
public void Receive(string counter)
{
labCounter.Text = counter;
}
}
}
主窗体布局如图:一个单击按钮(btnCounter)一个复位按钮(btnClear).
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Csharp窗体练习
{
public delegate void ShowCounterDele(string counter);//【1】声明个委托,一般在类外面声明
public partial class Form1 : Form
{
ShowCounterDele showCounterdel; //【2】定义委托对象
public Form1()
{
InitializeComponent();
frmOther frmother = new frmOther();
frmOther1 frmother1 = new frmOther1();
frmOther2 frmother2 = new frmOther2();
showCounterdel += frmother.Receive; //【3】将委托对象与方法关联起来
showCounterdel += frmother1.Receive;
showCounterdel += frmother2.Receive;
frmother.Show();
frmother1.Show();
frmother2.Show();
}
private int count = 0;
private void btnCounter_Click(object sender, EventArgs e)
{
count++;
showCounterdel(count.ToString()); //【4】、通过委托调用方法
}
private void btnClear_Click(object sender, EventArgs e)
{
count=0;
showCounterdel(count.ToString());
}
}
}
执行上面程序,点击主窗体中的按钮,从窗体会显示单击次数。点击主窗体的复位按钮然后计数归零。