在c#里面,有的时候一些代码的实现必须用到委托,比如:线程里面修改某个textBox的值,如果直接在线程里面写修改的代码,执行时候,编译器会报错,因为c#不允许这样写。还有在单独写的类里面,修改某个form里面某个控件的属性值等等,也是不被允许的。这时候,就需要使用到委托(delegate)。委托其实是这样的,为某些实现写一个函数,并将其赋值给委托(相当于函数指针),在使用 的时候直接通过委托名来调用。
声明和定义委托分为4个步骤:
1.声明一个委托(函数指针)
2. 创建委托对象
3. 创造符合委托格式的函数。(指针指向的函数)
4. 将函数名称赋值给委托。
下面是一个简单的例子:
我使用vs2013新建了一个windows窗体应用程序,默认新建的窗口名字为Form1,双击窗口进入form1的代码编写页面,如图:
接下来进行第1步+第2步:委托的声明和委托对象的定义(要写在与form1的默认构造函数并列的位置)
然后在form1里面拖入两个控件,一个是button1,一个是label1,现在自己写一个函数reFresh(),用来修改label1的text,这就是
第3步创造符合委托格式的函数。然后在form1_load里面进行第4步将函数名称赋值给委托。如图:
接下来的步骤是我自己写的一个调用,我自己写了一个类dele(不知道怎么自定义写类的自行百度),内容如下:
现在开始写button1的函数,让我们可以运行出执行完的效果;函数内容如下:
然后就可以开心的运行了;以下是运行截图,点击button1一次,就会实现label1数据的一次自增;
下面是我对代码的粘贴,试验的时候可以自行拷贝;
Form1.cs:
namespace Delegate
{
public partial class Form1 : Form
{
public delegate void RefreshLable(); //委托的声明,我取的名字是RefreshLable,返回值类型自主定义;
public RefreshLable refL1; //创建委托对象;
public Form1()
{
InitializeComponent();
}
int i = 0; //声明一个int值,用来作为文本框的值;
public void reFresh() //创造符合委托格式的函数。(i自增,在文本框里显示);
{
i++;
label1.Text = i.ToString();
}
private void Form1_Load(object sender, EventArgs e)
{
refL1 = reFresh; //将函数名称赋值给委托;
dele.frm = this; //这句是一定要写的,用来告诉编译器dele类里的对象frm指的是这个from1;
}
private void button1_Click(object sender, EventArgs e)
{
dele de = new dele(); //实例化一个dele类的对象;
de.useDelegate(); //调用类的函数,实现委托的使用;
}
}
}
dele.cs
public class dele
{
public static Form1 frm; //定义一个from类的对象;
public void useDelegate() //写这个函数,来调用委托;
{
frm.Invoke(frm.refL1); //调用委托一定得使用这种方式;
}
}