简介
委托vs函数指针
函数指针:指向内存的位置,存放的就是一个内存地址。类型不安全。无法判断实际指向的是什么
委托:面向对象的函数引用,线程安全。
使用场景
当方法的参数是一个方法的时候。
自我理解
就是一个用来集中调用方法的方法集合。当然这个集合是有签名(返回值,参数..)约束。
声明委托
定义可以放在 类所能放在的位置:名称空间下 类的内部,外部 。private protect public 修饰。
使用关键字 delegate
例:delegate int getTotal(string word);
分析:声明和虚方法声明很像。
作用:上面的声明就想当于声明了一个“集合”里面只可以放 返回值是 int参数为string的方法。
使用委托
使用 + +=来添加方法 - -+ 删除
使用.Invoke(参数)/直接加上(参数) 来执行里面的所有方法
例:
//定义 是没有参数的所以添加也要没有参数 (签名)
private delegate string GetTotal();
static void Main(){
string testWord="hello word";
//注:添加的是方法的引用不是 调用方法所以不能加()
GetTotal myFirstDelegate=new GetTotal(testWord.Trim);
//也可以 GetTotal myFirstDelegate=testWord.Trim;
//添加
myFirstDelegate+=testWord.ToUpper;
myFirstDelegate+=testWord.ToString;
//调用
myFirstDelegate();
}
...
注:当其中一个方法抛出异常就会停止下面的方法执行。所以可以使用手动迭代
Delegate[] delegates = myFirstDelegate.GetInvocationList();
foreach (Delegate dg in delegates){
Console.Write(dg.DynamicInvoke(null));
}
匿名初始化(当不重复使用的时候可以简化书写)
GetTotal myFirstDelegate=delegate(){
return “wahaha”;
};
事件与委托的关系
为什么在委托中将事件呢
事件是基于委托的;
例:
EventHandler 事件源码
namespace System
{
//
// 摘要:
// 表示将处理不包含事件数据的事件的方法。
public delegate void EventHandler(object sender, EventArgs e);
}
其实就是一个特殊的双参数的委托。
事件简单的来说就是:
1.创建委托
2.委托的实例–>对应事件的处理事件,触发的事件。
3.触发因素。就是来调用委托的某个方法。