1.委托的聲明
Delegate可以指定返回值類型舞骆;Aciton無返回值類型茁影;Func的最后一個參數(shù)表示返回值類型;Predicate是返回bool型的泛型委托
(1)delegate
delegate我們常用到的一種聲明
Delegate至少0個參數(shù)值戳,至多32個參數(shù)锣光,可以無返回值,也可以指定返回值類型蔬浙。
例:public delegate int MethodtDelegate(int? x,int y);表示有兩個參數(shù)猪落,并返回int型。
(2)Action
Action是無返回值的泛型委托畴博。
Action 表示無參笨忌,無返回值的委托
Action<int,string> 表示有傳入?yún)?shù)int,string無返回值的委托
Action <int,string,bool>表示有傳入?yún)?shù)int,string,bool無返回值的委托
Action <int,itn,int,int>表示有傳入4個int型參數(shù),無返回值的委托
Action至少0個參數(shù)绎晃,至多16個參數(shù)蜜唾,無返回值杂曲。
例:
public void Test<T>(Action<T>?action,T p)
{
? ? ? ? ? ? ?action(p);
}
(3)Func
Func是有返回值的泛型委托
Func<int>? ? ? ? ? ? ? ? ? ? ? ? ? ?表示無參庶艾,返回值為int的委托
Func<object,string,int> ?表示傳入?yún)?shù)為object, string,int 返回值為int的委托
Func<T1,T2,T3,int> ? ? ? ? 表示傳入?yún)?shù)為T1,T2,,T3(泛型)返回值為int的委托
Func至少0個參數(shù),至多16個參數(shù)擎勘,根據(jù)返回值泛型返回咱揍。必須有返回值,不可void
例:
public int Test<T1,T2>(Funcfunc<T1,T2>,T1 a,T2 b)
{
? ? ? ? ? ? ? ? ?returnfunc(a, b);
}
(4)predicate
predicate 是返回bool型的泛型委托
predicate<int> 表示傳入?yún)?shù)為int 返回bool的委托
Predicate有且只有一個參數(shù)棚饵,返回值固定為bool
例:public delegate bool Predicate<T> (T obj)
2.delegate和 event 區(qū)別
如果 被聲明成事件的話, 將會被添加到一個委托的抽象層之中.以防止這個事件被重置(比如 deleDemo = nulll 操作).
事件只允許 對委托列表的 添加 和 移除目標(biāo)的操作, 其它操作全部禁止.
如果每次都聲明 一個 委托類,然后 這個類再去創(chuàng)建對象 而創(chuàng)建的 委托個數(shù)比較少的話. 很顯然有些劃不來.
這樣 C# 為我們提供了一些,系統(tǒng)集成的 泛型委托,
public Action nextState;
當(dāng)然 這些委托也可以聲明成 事件.
public event Action nextState;
這樣我們就直接得到了 , 委托和事件的 實(shí)體對象.
Action的 返回類型 為void ,固定不可改變的 . 其參數(shù)是 1-16個 不同且任意類型的參數(shù). 不可以是空參數(shù).
Action
Func
和action 的用法 基本相同 ,只不過是多了個 可以定義返回值的功能.在<參數(shù)1,參數(shù)2,參數(shù)3,參數(shù)4,參數(shù)5,參數(shù)6...... 返回值類型>.
例子:
namespace Test
{? ??
? ? ? ?class Program? ??
{? ? ? ??
? ? ? ? static void Main(string[] args)? ? ? ??
? ? ? ? {? ? ? ? ? ??
? ? ? ? ? ? ? ? Func < double, double,double> DoAddtion = calculate.addtion;? ? ? ? ? ??
? ? ? ? ? ? ? ? double result = DoAddtion(20, 50);? ? ? ? ? ??
? ? ? ? ? ? ? ? ?Console.WriteLine("result的值是:{0}",result );? ? ? ? ? ??
? ? ? ? ? ? ? ? ?Console.WriteLine("Func帶返回參數(shù)委托做加法結(jié)果為:{0}", DoAddtion(10, 30));? ? ? ? ? ?
? ? ? ? ? ? ? ? ? calculate c = new calculate();? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ActionDoSubstraction = c.substraction;
? ? ? ? ? ? ? ? ? DoSubstraction(90, 20);
? ? ? ? ? ?}
}
class calculate
{
? ? ? ? ? public static double addtion(double x, double y)
? ? ? ? ?{
? ? ? ? ? ? ? ? return x + y;
? ? ? ? ?}
? ? ? ? ?public void substraction(double x, double y)
? ? ? ? ?{
? ? ? ? ? ? ? Console.WriteLine("Action不帶返回參數(shù)委托做減法結(jié)果為:{0}", x - y);
? ? ? ? ?}
}
}