委托 delegate
<font size=2>是一個(gè)類芳室,它定義了方法的類型秽褒,使得可以將方法當(dāng)作另一個(gè)方法的參數(shù)來(lái)進(jìn)行傳遞聋庵。它可以定義在類體外饱苟。</font>
// 實(shí)例化
Action<int> fun1 = new Action<int>(
delegate(int i){
Console.WriteLine(i);
});
// 匿名函數(shù)
function Method1(Action<int> callback)
{
callback();
}
Method1(delegate(i){
Console.WriteLine(i);
});
// Lambda表達(dá)式
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>委托對(duì)象的類型為Delegate炊邦,可以將自定義的委托存入,取出轉(zhuǎn)換類型再調(diào)用</font>
List<Delegate> lstDe = new List<Delegate>();
...
MyDelegate myd = lstDe[0] as MyDelegate;
myd();
事件 event
<font size=2>事件是基于委托的封裝熟史,主要解決兩個(gè)問(wèn)題:
<li>委托第一次添加事件時(shí)馁害,里要初始化
<li>無(wú)法修改委托的權(quán)限使其不被外部修改
</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>無(wú)返回類型的泛型委托</font>
public Action actionDelegate1;
public Action<string, int> actionDelegate2;
Func
<font size=2>有返回類型的泛型委托,參數(shù)最后一項(xiàng)為返回值類型</font>
// 參數(shù)為string型蹂匹,返回值為int型
public Func<string, int> funcDelegate;
Predicate
<font size=2>返回類型為bool的委托</font>
// 返回bool碘菜,參數(shù)為int
public Predicate<int> predicateDelegate;
EventHandler
<font size=2>事件處理函數(shù)的委托</font>
// FCL中的聲明
public delegate void EventHandler(object sender, EventArgs e);
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs : EventArgs;