大学大学,大概学学 之 由委托联想到的

委托(delegate)是一个类,内部封装了一个或多个方法。定义委托需要制定方法签名。

delegate C MyDelegate(A a,B b);

此委托可以封装多个“接收A、B类型参数且返回C类型的方法“。

利用委托可以向方法中注入代码,委托是匿名方法的基础,因为匿名方法在动态地注入代码的时候,编译器会自动生成委托对象,Lambda表达式就是一个匿名方法。

系统定义了Action<T>委托和Func<T>委托:
Action<T1,T2>表示接收T1,T2两个泛型参数,Action返回类型只能是void;
Func<T1,T2,TResult>表示接收T1,T2两个泛型参数,返回TResult泛型。

例如,在LINQ中,标准查询操作符where的原型为:

public static IEnumberable<T> Where<T>(this IEnumberable<T> source , Func<T,bool> predicate);

这是一个扩展方法,this关键字放在IEnumberable<T>前面表示所有该类型的对象都会扩展一个Where方法,所以,第一个参数source不用传入,而是source调用Where方法,参数predicate是一个Func泛型委托,用于接收符合规格的方法。
例如:

{
//...
int[] nums=new int[]{3,2,8,6,10};
IEnumberable<int> results=nums.Where(i=>i>5);
foreach(int i in results)
Console.WriteLine(i);
//...
}
在这里T就是int,i=>i>5是匿名方法赋给委托predicate,在foreach中对每个数进行判断(调用匿名方法),只有满足大于5的数才会添加进results,这个数就加入results中并且打印出来(至于为什么在foreach中才进行判断是因为Where方法具备延时查询特性)。
(tips:突然发现扩展方法比访问者模式好用??求证)

说到委托,就想到事件(event),事件是委托的实例,事件的创建必须依赖于某个预先定义好的符合规格的委托类型,事件负责调用已挂载到对应委托下的所有方法。
委托与事件可以实现Observer模式:

class Subject
{
//... ... 定义观察者感兴趣的信息

public delegate void UpdateHandler(object sender,
PriceEventAges e);
public event UpdateHandler UpdateEvent;

public void Notify()
{
PriceEventAges e = new PriceEventAges();
//... ... 初始化e
UpdateEvent(this, e);
}
}

sender表示被观察者,e是PriceEventAges类型(此类型自己定义),包含观察者"感兴趣"的Subject中的信息,UpdateEvent(this, e)通知所有观察者
Client中用UpdateEvent += new Subject.UpdateHandler(XXX)挂载方法,即由UpdateEvent触发的观察者中的方法。
用委托与事件实现Observer模式 ,各个观察者之间被触发的方法可以不同名。

大学课少,尝试写个博客,新手,大家不要笑,有错误一定要指出啊,谢谢   :)

posted @ 2011-05-26 22:15  Chen.  Views(1584)  Comments(0Edit  收藏  举报