大学大学,大概学学 之 由委托联想到的
委托(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);
//...
}
(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模式 ,各个观察者之间被触发的方法可以不同名。
大学课少,尝试写个博客,新手,大家不要笑,有错误一定要指出啊,谢谢 :)