委托和事件的关系

1.委托的定义:

   delegate 是一种可用于封装命名或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的(MSDN的定义)。委托是引用类型。

委托还有一些泛型委托:

  Action<T>只能委托无返回值的方法,而且可以传入的参数个数在0-16之间。

  Predicate<T>委托返回bool值的的方法,只能输入一个参数类型。

  

 public class People
   {
  public event Predicate<int> Compare;


       public void Start()
       {
           if (this.Compare(1))
               Console.WriteLine("开始");
           else
               Console.WriteLine("等待");
       }
    }

//调用
 People p = new People();
  p.Compare += (int preValue) => { if (preValue == 1)return true; else return false; };
 p.Start();

  Func<TResult>绑定一个参数(范围0-16)但却返回 TResult 参数指定的类型值的方法

  例如:Func<T,TResult> Func<T,T,TResult>  Func<T,T,...,TResult>

  

例如:

2.事件的定义:

  事件是一种特殊的委托,是委托的一种特殊应用。委托是事件的基础,通过将委托与命名方法或者匿名方法关联,可以实例化委托,然后委托实例化相应的事件。

 事件的使用方式:事件能通过+=和-=两个方式注册或者注销对其处理的方法,使用+=与-=操作符的时候,系统会自动调用对应的 add_XXX、remove_XXX 进行处理。

  事件处理方法的绑定:在绑定事件处理方法的时候,事件出现在+=、-= 操作符的左边,对应的委托对象出现在+=、-= 操作符的右边。对应以上例子,事件提供了更简单的绑定方式,只需要在+=、-= 操作符的右方写上方法名称,系统就能自动辩认。也可以使用匿名方法(例如:personManager.MyEvent += delegate(string name){ Console.WriteLine("My name is "+name);)或者lambda表达式(例如:personManager.MyEvent += (string name)=>{ Console.WriteLine("My name is"+name); })绑定事件。

示例:

测试示例

 

posted @ 2015-07-11 16:19  聆听的风声  阅读(641)  评论(0)    收藏  举报