委托和事件的关系
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); })绑定事件。
示例:
测试示例

浙公网安备 33010602011771号