委托 delegate
是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。它可以定义在类体外。
// 实例化
Action<int> fun1 = new Action<int>(
delegate(int i){
Console.WriteLine(i);
});
// 匿名函数
function Method1(Action<int> callback)
{
callback();
}
Method1(delegate(i){
Console.WriteLine(i);
});
// Lambda表达式
Method1(i=>Console.WriteLine(i));
public delegate string GetNameDelegate; public class Test { public Test() { PrintName(GetNameID, 11); } private void PrintName(GetNameDelegate fun, int id) { Console.WriteLine( fun(id) ); } private string GetNameID(int id) { return "HeHe " + id; } }
委托对象的类型为Delegate,可以将自定义的委托存入,取出转换类型再调用
List<Delegate> lstDe = new List<Delegate>();
...
MyDelegate myd = lstDe[0] as MyDelegate;
myd();
事件 event
事件是基于委托的封装,主要解决两个问题:
- 委托第一次添加事件时,里要初始化
- 无法修改委托的权限使其不被外部修改
-
public class MouseListener { public delegate void CallbackDelegate(GameObject go); public event CallbackDelegate eventMouseClick; } public void Test() { MouseListener liser = new MouseListener(); // 第一次使用不需要赋值操作 liser.event += OnMouseClick; // 不可以改变event的值 // liser.event = OnMouseClick // Error } private void OnMouseClick(GameObject go) { }
Action
无返回类型的泛型委托
public Action actionDelegate1; public Action<string, int> actionDelegate2;
Func
有返回类型的泛型委托,参数最后一项为返回值类型
// 参数为string型,返回值为int型 public Func<string, int> funcDelegate;
Predicate
返回类型为bool的委托
// 返回bool,参数为int public Predicate<int> predicateDelegate;
EventHandler
事件处理函数的委托
// FCL中的声明 public delegate void EventHandler(object sender, EventArgs e); public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs : EventArgs;