委托与事件的使用
一、
委托的声明
delegate void MyDelegate(参数) //不返回值 。返回值则更改void为返回值类型
public class MyDelegate:MulticastDelegate
//同步调用委托方法
public virtual void Invoke();
//异步调用委托方法
public virtual IAsyncResult BeginInvoke(***,AsyncCallback callback,object state);//自动生成的,必须协变AsyncResult的用途有这么几个:传递参数,它包含了对调用了BeginInvoke()的委托的引用;它还包含了BeginInvoke()的最后一个Object(state)类型的参数;它可以鉴别出是哪个方法的哪一次调用,因为通过同一个委托变量可以对同一个方法调用多次。*代表委托定义的参数是一致的,callback是回掉的委托类型,定义格式为AsyncCallback(IAsyncResult rt),state--Object类型用于传递任何你想要的数值,它可以通过IAsyncResult.AsyncState属性获得
}
不过执行委托直接Mydelegate(参数)即可,如果要返回委托链中的每个值可以用mydelegate的 GetInvocationList()方法获得委托链,然后分别使用invoke或者delegate基类中的DynamicInvoke()执行委托,返回值。
都是声明委托用的,第一个是生命没返回值的委托,第二个则是有返回值,第三个只返回bool值,例如
Func<int,int> ADelegate = (m=>m+1);
使用委托注意事项
1、委托属于引用类型,必须new。例如:
MyDelegate myDelegate=new MyDelegate(Method);
2、第一次加入委托链使用“=”,后续则“+=”
3、Method参数必须与定义的委托MyDelegate一致
4、委托可以作为方法的参数
5、语法规范,委托要以Delegate结尾命名
泛型委托的定义
delegate void Handler<T>(T obj);
Predicate<String> p //它始终只返回bool值。一般用于集合类 判断返回对象
public static bool Contains<T>(this IEnumerable<T> collection, Predicate<T> condition)
{
return collection.Any(x => condition(x));
}
二、
事件的声明
public delegate void MyEventHandler(Object sender, MyEventArgs e);
public event MyEventHandler MyEvent{add{MyEventHandler+=value};remove{MyEventHandler-=value}}; //声明事件 执行:MyEvent(this,e),e如果自定义,必须继承自EventArges .后边的add和remove是事件访问器
事件其实就是声明了一个委托类型的封装的变量而已
使用事件的注意事项
1\编码规范:委托类型的名称都应该以EventHandler结束。
事件的命名为 委托去掉 EventHandler之后剩余的部分。
继承自EventArgs的类型应该以EventArgs结尾。
2\直接可以使用+=和-=加入和删除委托链
3、事件由事件发布者执行 ,因为事件总是私有的