委托是用户自定义的类,它定义了方法的类型。储存的是一系列具有相同参数和返回类型方法的地址列表,调用委托时,此委托列表的所有方法都将被执行。
委托的优点
- 基于委托,开发事件驱动程序变得简单
- 简化多线程
- 多对象之间的数据传递和操作
委托的基本定义及使用
class Program{static void Main(string[] args){//【3】创建委托对象,关联具体方法CalculatorDelegate cal = new CalculatorDelegate(Add);//【4】通过委托去调用方法int result1 = cal(10, 20);Console.WriteLine(\"a+b=\" + result1);cal -= Add;//断开当前委托方法cal += Sub;//重新指向一个新的方法int result2 = cal(10, 20);Console.WriteLine(\"a-b=\" + result2);Console.ReadLine();}//【2】根据委托定义一个具体的方法及实现static int Add(int a,int b){return a + b;}static int Sub(int a, int b){return a - b;}}//【1】声明委托,定义到类外面public delegate int CalculatorDelegate(int a, int b);
从窗体向主窗体发送消息
点击从窗体按钮,发送消息给主窗体
消息的发出者,创建委托变量并且调用委托变量,传递信息
//主窗体public partial class FrmMain : Form{public FrmMain(){InitializeComponent();}//【2】创建委托方法public void Receiver(string count){this.lblCount.Text = count;}private void button1_Click(object sender, EventArgs e){FrmOther frmOther = new FrmOther();frmOther.Show();frmOther.showCount = this.Receiver;}}//【1】声明委托public delegate void ShowCount(string count);//从窗体public partial class FrmOther : Form{public FrmOther(){InitializeComponent();}//【3】创建委托变量public ShowCount showCount;private int sum = 0;private void button1_Click(object sender, EventArgs e){sum++;if (showCount != null){showCount(sum.ToString());}}}
委托的多播
委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。
使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播
- 声明委托
- 在消息接收方创建委托方法
- 在消息发送方创建委托变量,因为需要广播信息
- 委托变量关联方法
- 在消息发送方调用委托变量传递信息
//主窗体public partial class FrmMain : Form{public FrmMain(){InitializeComponent();FrmOther1 frmOther1 = new FrmOther1();FrmOther2 frmOther2 = new FrmOther2();//关联委托方法this.showCount += frmOther1.Receiver;this.showCount += frmOther2.Receiver;frmOther1.Show();frmOther2.Show();}//创建委托对象public ShowCount showCount;int count = 0;private void button1_Click(object sender, EventArgs e){count++;//传递委托信息this.showCount(count.ToString());}private void button2_Click(object sender, EventArgs e){count = 0;//传递委托信息this.showCount(count.ToString());}}//【1】声明委托对象public delegate void ShowCount(string count);//从窗体1public partial class FrmOther1 : Form{public FrmOther1(){InitializeComponent();}//委托方法public void Receiver(string count){this.lbl.Text = count;}}
事件
事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。
事件的本质就是一个私有化的委托对象,以及两个公有的方法,add和remove
C# 中使用事件机制实现线程间的通信。
微软的代码生成器中,本质就是委托+事件
事件的流程
- 声明委托
- 声明事件
- 激发事件
- 编写事件的响应方法(VS的控件中事件就是自己编写方法)
- 关联事件
//【1】声明委托public delegate void delegateMsg(string msg);public partial class FrmMain : Form{public FrmMain(){InitializeComponent();FrmClient1 frmClient1 = new FrmClient1();FrmClient2 frmClient2 = new FrmClient2();//【5】关联事件frmClient1.eventMsg += new delegateMsg(ReceiveMsg);frmClient2.eventMsg += new delegateMsg(ReceiveMsg);frmClient1.Show();frmClient2.Show();}//【4】事件响应方法public void ReceiveMsg(string msg){this.txtMsg.Text = msg;}}public partial class FrmClient1 : Form{public FrmClient1(){InitializeComponent();}//【2】声明事件public event delegateMsg eventMsg;private void btnSender_Click(object sender, EventArgs e){//【3】激发事件,传递参数eventMsg(\"客户端1:\" + this.txtMsg.Text.Trim());}}
效果图