委托与事件的使用

一、

委托的声明

 delegate void MyDelegate(参数) //不返回值 。返回值则更改void为返回值类型 

 

 编译后MyDelegate继承自System.MulticastDelegate类,会自动添加如下三个方法,用于同步或者异步执行委托

 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属性获得
          public virtual void EndInvoke(IAsyncResult result);//EndInvoke()方法接受IAsyncResult类型的对象,根据委托是否有返回值而返回值
      }

不过执行委托直接Mydelegate(参数)即可,如果要返回委托链中的每个值可以用mydelegate的 GetInvocationList()方法获得委托链,然后分别使用invoke或者delegate基类中的DynamicInvoke()执行委托,返回值。

 

 

 Action 和 Func  Predicate

 都是声明委托用的,第一个是生命没返回值的委托,第二个则是有返回值,第三个只返回bool值,例如

 Func<int,int> ADelegate = (m=>m+1);

int result=ADelegate(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结束。

委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
事件的命名为 委托去掉 EventHandler之后剩余的部分。
继承自EventArgs的类型应该以EventArgs结尾。

 2\直接可以使用+=和-=加入和删除委托链

3、事件由事件发布者执行 ,因为事件总是私有的

posted @ 2012-11-26 14:34  张放春  阅读(166)  评论(0编辑  收藏  举报