委托:委托是一个类型,是一个函数指针类型,这个类型将该委托的实例化对象所能指向的函数的细节封装起来了,既规定了所能指向的函数的签名,也就是限制了所能指向的函数的参数和返回值。当实例化委托的时候,委托对象会指向某一个匹配的函数,实质就是将函数的地址赋值给了该委托的对象,然后就可以通过该委托对象来调用所指向的函数了。
多播委托:委托也可以包含多个方法,这时候要向委托对象中添加多个方法,这种委托称为多播委托。
多播委托的每一个方法都要与委托所限定的方法的返回值、参数匹配。
INvoke()方法是委托的同步调用的方法。
注意:不管是多播委托还是单播委托,在没有特殊处理的情况下,在一个线程的执行过程中去调用委托,调用委托的执行是不会新起线程的,这个执行还是在原线程中的,这个对于时间也是一样。当然,如果是在委托所指向的函数里面去启动一个新的线程那就是另外一件事了。
事件:
触发事件后,事件所指向的函数将会被执行。这种执行是通过事件名称来调用的,就想委托对象名一样的。
触发事件的方法只能在A类中定义,事件的实例化,以及实例化之后的实现体都只能在A类外定义。
在B类中去调用A类中的触发事件的方法:用A类的对象去调用A类的触发事件的方法。
程序实例
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace DelegateStudy
{
public delegate void DelegateClick (int a);
public class butt
{
public event DelegateClick Click;
public void OnClick(int a)
{
if(Click != null)
Click.Invoke(a);
//Click(a);//这种方式也是可以的
MessageBox.Show("Click();");
}
}
class Frm
{
public static void Btn_Click(int a)
{
for (long i = 0; i < a; i++)
Console.WriteLine(i.ToString());
}
static void Main(string[] args)
{
butt b = new butt();
//在委托中,委托对象如果是null的,直接使用+=符号,会报错,但是在事件中,初始化的时候,只能用+=
b.Click += new DelegateClick (Fm_Click); //事件是基于委托的,所以委托推断一样适用,下面的语句一样有效:b.Click += Fm_Click;
//b.Click(10);错误:事件“DelegateStudy.butt.Click”只能出现在 += 或 -= 的左边(从类型“DelegateStudy.butt”中使用时除外)
b.OnClick (10000);
MessageBox.Show("sd234234234");
Console.ReadLine();
}
}
}
控件事件
基于Windows的应用程序也是基于消息的。这说明,应用程序是通过Windows来与用户通信的,Windows又是使用预定义的消息与应用程序通信的。这些消息是包含各种信息的结构,应用程序和Windows使用这些信息决定下一步的操作。
比如:当用户用鼠标去点击一个windows应用程序的按钮的时候,windows操作系统就会捕获到这个点击按钮的动作,这个时候它会根据捕获到的动作发送一个与之对应的预定义的消息给windows应用程序的这个按钮,windows应用程序的按钮消息处理程序会处理接收到的消息,这个程序处理过程就是根据收到的消息去触发相应的事件,事件被按钮触发后,会通知所有的该