c#里面委托(delegate)的讲解

       在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);    //调用委托一定得使用这种方式;
        }
    }
 
 

发布了16 篇原创文章 · 获赞 127 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/kiss__soul/article/details/79180723
今日推荐