委托
1、 什么是委托?
委托就是具有相同签名和返回值类型的有序方法列表
它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递
- 是一种引用类型
- 方法的列表称为调用列表
- 当委托被调用时,它调用列表中的每个方法
如图:
2、 委托的声明
先来看看委托是如何声明的
a、委托类型的声明看上去与方法的声明很类似,有返回类型和签名。返回类型和签名指定了委托接受的方法的形式
b、委托类型与方法声明的不同之处:
▲ 委托是以关键字delegate开头的
▲ 委托没有方法主体
3、 委托的应用
给大家写个简单易懂的实例,看完就知道委托时怎么一回事了
先创建两个窗体Form1和Form2,点击Form1中的按钮弹出Form2,可以在Form2中点击按钮改变Form1的背景色
接下来,我们来看看里面的具体代码,看看用委托是如何实现的
Form1里面的代码:
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 delegateWindowsForms { //首先声明一个无返回值、无参数的委托 public delegate void MyDel(); public partial class Form1 : Form { public Form1() { InitializeComponent(); } //打开第二个窗口 private void button1_Click(object sender, EventArgs e) { MyDel del = new MyDel(ChangeColor); //实例化一个委托,把改变颜色的方法放到容器里面 del += ChangeButtonText;//再向容器里添加改变按钮标题的方法 Form2 frm2 = new Form2(del); //把委托挡着参数,传给frm2。这样frm2就可以调用了 frm2.ShowDialog(); } //改变第二个窗口背景颜色为红色 public void ChangeColor() { this.BackColor = Color.Red; } //改变“改变第一个Form”的名称为”骚年,我已经变色了“ public void ChangeButtonText() { this.button1.Text = "骚年,我已经变色了"; } } }
Form2里面的代码:
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 delegateWindowsForms { public partial class Form2 : Form { MyDel delChange; public Form2(MyDel del) { InitializeComponent(); this.delChange = del; } //颜色改变按钮的点击事件 private void button1_Click(object sender, EventArgs e) { delChange(); //委托调用 } } }
运行代码,点击Form1中的按钮,弹出Form2,
在Form2中点击改变Form1颜色按钮,可以发现,Form1的背景色瞬间变为红色,并且“改变第一个Form”的名称变为”骚年,我已经变色了“
这样我们就跨窗体操作了控件。
仔细观察以下两句代码我们可以知道,如何向委托这个容器添加方法。
当实例化委托后,我们可以用“+=”向委托里面继续添加方法;
如代码中所写:
MyDel del = new MyDel(ChangeColor); //实例化一个委托,把改变颜色的方法放到容器里面
del += ChangeButtonText;//再向容器里添加改变按钮标题的方法
小结:委托是面向对象的,它定义方法签名的类型,可以与具有兼容签名的任何方法关联。
我们可以通过委托调用方法。委托用于将方法作为参数传递给其他方法。