声明一个基于某个委托的事件
Event delegateName eventName;
eventName不是一个类型,而是一个具体的对象,这个具体的对象只能在类A内定义而不能在类A外定义。
在类A中定义一个触发该事件的方法
ReturnType FunctionName([parameters])
{
……
If(eventName != null)
{
eventName([parameters]);
或者eventName.Invoke([parameters]);
}
……
}
触发事件之后,事件所指向的函数将会被执行。这种执行是通过事件名称来调用的,就像委托对象名一样的。
触发事件的方法只能在A类中定义,事件的实例化,以及实例化之后的实现体都只能在A类外定义。
初始化A类的事件
在类B中定义一个类A的对象,并且让类A对象的那个事件指向类B中定义的方法,这个方法要与事件关联的委托所限定的方法吻合。
触发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();
}
}
} |