事件和委托的区别:
1.事件的声明只是在委托前面加一个event关键词,虽然你可以定义一个public,但是有了event关键词后编译器始终会把这个委托声明为private,然后添加1组add,remove方法。add对应+=,remove对应-=。这样就导致事件只能用+=,-=来绑定方法或者取消绑定方法。而委托可以用=来赋值,当然委托也是可以用+=,-=来绑定方法的
2.委托可以在外部被其他对象调用,而且可以有返回值(返回最后一个注册方法的返回值)。而事件不可以在外部调用,只能在声明事件的类内部被调用。
委托
委托于引用相似引用指向特定的对象,而委托指向特定方法
对象引用 ---> 特定对象
委托 ---> 特定方法
方法的标识:返回值类型,参数个数,参数类型
用delegate声明委托,委托的声明与委托的方法的标识要一致
public delegate int MyDelegate(int a, int b); //委托的声明
public int MyDelegateFunc(int a, int b); //委托方法
实例化一个委托
MyDelegate arithMethod = new MyDelegate(MyDelegateFunc); //实例化一个委托,委托方法为
使用委托
int sum = arithMethod(3, 4);
*** 委托的声明要放在函数的外部(包括Main()函数)***
委托同时也可以作为参数传递给其他函数,这样其他函数就可以通过委托来调用委托函数了
多重委托
arithMethod += new MyDelegate(Add);
arithMethod += new MyDelegate(Subtract);
arithMethod -= new MyDelegate(MyDelegateFunc);
//多重委托的函数返回值必须是void类型的
事件
事件的委托定义
public delegate void EventDelegate(object sender, EventArgs s);
//两个参数:事件的触发类,事件信息
定义一个事件
public event EventDelegate MyEvent;
事件处理方法
public void OnMyEvent(object sender, EventArgs s);
myEvent += new EventDelegate(OnMyEvent);
触发事件
myEvent(this, null);
多重事件:与多重委托相同
利用事件传递数据
定义一个System.EventArgs类的子类
public class MyEventArgs:EventArgs
{
private int myValue;
public MyEventArgs(int myValue)
{
this.myValue = myValue;
}
public int MyValue
{
get { return myValue; }
}
}
声明事件委托
public delegate void EventDelegate(object sender, MyEventArgs e);
定义事件
public event EventDelegate myEvent;
myEvent += new EventDelegate(OnMyEvent);
定义事件处理函数OnMyEvent
public void OnMyEvent(object sender, MyEventArgs e)
{
}
触发事件
myEvent(this, new MyEventArgs(10));