委托:相当于C/C++中的函数指针,它能够引用函数,只不过在C#中,委托是一个对象,并且是类型安全的,避免了函数指针的不安全性。一个委托类型的变量可以引用一个或多个方法。
1、可以被委托变量引用的方法需满足:方法签名与委托一致;方法返回值要与委托一致;
2、委托声明、实例化、调用
public delegate void DoProcess(string msg);//声明委托
DoProcess process = new DoProcess(className.method);//构造函数方式实例化
DoProcess process = className.method;//直接将目标方法签名赋给变量
process("W");//想引用方法一样调用委托
//被引用的方法定义
method(string msg)
{
}
3、相同类型的委托变量可以通过“+”号组合,也可以通过“-”号删除其中一个成员;
4、为一个委托变量添加或减少方法:通过“+=”或“-=”运算符来实现;
5、委托在回调中的应用:相当有一个函数有委托类型的形参,并且在调用该函数时,传入一个已经实例化的委托类型的变量;
事件:委托是事件的基础。事件涉及2类角色:触发事件的对象称为事件发布者,捕获事件并对其做出响应的对象叫做事件订阅者。事件触发时,事件发布者发布消息并通过中介【委托】通知相应的事件订阅者来处理。
public classs EventSample
{
//事件定义
public event EventHandler PrintComplete;
//触发事件
public void OnPrintComplete()
{
if(PrintComplete != null)
{
PrintComplete(this, new EventArgs());
}
}
public static void main()
{
EventSample eventSample = new EventSample();
Printer printer = new Printer(eventSample);
eventSample.OnPrintComplete();
}
}
public class Printer
{
public Printer(EventSample eventSample)
{
//事件订阅:为事件绑定事件处理方法
eventSample.PrintComplete +=ShowMessage;
eventSample.PrintComplete += SendSmsToMobile;
}
public void ShowMessage(object sender, EvenArgs e)
{
//```````
}
public void SendSmsToMobile(object sender, EventArgs e)
{
//``````
}
}