浅谈委托事件

时间:2022-11-04 20:34:29


委托: 具有相同的方法签名和返回值类型的方法列表
我的理解:委托就是一个可以存放方法(地址)的容器,方法存放在委托中是无序的,当我们在委托中存放多个方法时,
我们不能确定委托调用方法的顺序。委托是一种类型,与类同级别。
委托定义:关键字 delegate
访问修饰符 delegate 返回值类型 委托名(参数......)
委托赋值:
public delegate void FistDelegate(int num);
protected void DelegateMethod(int n){Console.WriteLine("num:"+n)} //与委托有相同签名和返回值类型的方法;
FistDelegate fd=new FistDelegate(DelegateMethod);

FistDelegate fd=DelegateMethod;
添加多个方法用+=, 移除方法用-=;
调用委托
在调用委托之前先要判断委托是否为空
if(fd!=null){fd(12)}

调用带返回值类型的委托
注意:如果委托有返回值,且有多个委托,那么就返回最后一个方法返回的值。

调用引用参数的委托
delegate void MyDelegate(ref int num);
值会叠加

委托就不举例说明了,is easy

事件:
1.事件是成员,不是类型 所有事件只能在类中声明,不能在一段可执行的代码中声明事件
要注意一点事件是成员,可以把它当做变量,不能独立于类
2.事件中包含一个私有的委托,触发事件时,通过委托调用方法列表中的数据

3.事件的声明:需要一委托
访问修饰副 event 返回值类型 委托名 事件名;
protected event void EventHandler myEvent;

定义事件时委托可以是自定义委托,也可以是.Net 预定义的委托类型
最常用的是 EventHandler委托
EventHandler 委托:
public delegate void EventHandler(object sender,EventArgs e);
由上可以看到此委托有两个参数,
第一个参数:表示调用委托的对象,object类型
第二个参数:保持状态信息(说白了就是传递参数),但是EventArgs 类没有提供可以传递数据的属性,如果需要
传递数据,可以继承EventArgs类。见 实例
public event void EventHandler myEvent;
实例:
public delegate void MyEventHandler(object sender,MyEventArgs me);
public partial class Form1 : Form
{
public event MyEventHandler myEvent;
public Form1()
{
InitializeComponent();
myEvent += new MyEventHandler(Form1_myEvent);
}

void Form1_myEvent(object sender, MyEventArgs me)
{
MessageBox.Show(me.Message);
}

private void btnClick_Click(object sender, EventArgs e)
{
MyEventArgs ma = new MyEventArgs();
ma.Message = "我们都是中国人,";
if (myEvent != null)
{
myEvent(sender,ma);
}
}
}

public class MyEventArgs : EventArgs
{
private String message;

public String Message
{
get { return message; }
set { message = value; }
}

}


最后注意:只有声明事件的类才能调用事件