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