委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞。事件是一種特殊的委托。
1.委托的聲明
Delegate 類
Delegate是一種引用類型,我們在處理他的時候要當作類來看待而不是方法,說白了委托就是對方法或者方法列表的引用,調用一個委托實例就好像是調用c++中的指針一 樣,他封裝了對制定方法的引用,或者說委托起到的是橋梁的作用,實例后的委托對象會將給定的參數傳遞給他所回調的方法,並去執行方法。
Delegate至少0個參數,至多32個參數,可以無返回值,也可以指定返回值類型。
例:public delegate int MethodtDelegate(int x, int y);表示有兩個參數,並返回int型。
public delegate void myDelegate(string str); public static void HellowChinese(string strChinese) { Console.WriteLine("Good morning," + strChinese); Console.ReadLine(); } myDelegate d = new myDelegate(HellowChinese); d("Mr wang");
匿名方法
C#中幾個常用的委托(Action,Func,predicate)
Action
Action是無返回值的泛型委托。
Action 表示無參,無返回值的委托
Action<int,string> 表示有傳入參數int,string無返回值的委托
Action<int,string,bool> 表示有傳入參數int,string,bool無返回值的委托
Action<int,int,int,int> 表示有傳入4個int型參數,無返回值的委托
Action至少0個參數,至多16個參數,無返回值。
public delegate void Action<in T1, in T2, in T3, in T4>( T1 arg1, T2 arg2, T3 arg3, T4 arg4 )
Action是對委托的使用的簡化:
public static void HellowChinese(string strChinese) { Console.WriteLine("Good morning," + strChinese); Console.ReadLine(); } Action<string> action = HellowChinese; action("Spring.");
Func
Func是有返回值的泛型委托
Func<int> 表示無參,返回值為int的委托
Func<object,string,int> 表示傳入參數為object, string 返回值為int的委托
Func<object,string,int> 表示傳入參數為object, string 返回值為int的委托
Func<T1,T2,,T3,int> 表示傳入參數為T1,T2,,T3(泛型)返回值為int的委托
Func至少0個參數,至多16個參數,根據返回值泛型返回。必須有返回值,不可void
public delegate TResult Func<in T1, in T2, in T3, out TResult>( T1 arg1, T2 arg2, T3 arg3 )
Func也是對委托的使用的簡化:
public static string HelloEnglish(string strEnglish) { return "Hello." + strEnglish; } Func<string, string> f = HelloEnglish; Console.WriteLine(f("Srping ji")); Console.ReadLine();
predicate
predicate 是返回bool型的泛型委托
predicate<int> 表示傳入參數為int 返回bool的委托
Predicate有且只有一個參數,返回值固定為bool
public delegate bool Predicate<in T>( T obj )
2.總結
委托類似於 C++ 函數指針,但它們是類型安全的。
委托允許將方法作為參數進行傳遞。
委托可用於定義回調方法。
委托可以鏈接在一起;例如,可以對一個事件調用多個方法。
方法不必與委托簽名完全匹配。
Delegate至少0個參數,至多32個參數,可以無返回值,也可以指定返回值類型
Func可以接受0個至16個傳入參數,必須具有返回值
Action可以接受0個至16個傳入參數,無返回值
Predicate只能接受一個傳入參數,返回值為bool類型
使用Func<T,TResult>和Action<T>,Action而不使用Delegate其實都是為了簡化代碼,使用更少的代碼達到相同的效果,不需要我們顯示的聲明一個委托。
Func<T,TResult>的最后一個參數始終是返回類型,而Action<T>是沒有返回類型的,而Action是沒有返回類型和參數輸入的。
predicate<T> 使用的比較少。
參考 :https://msdn.microsoft.com/zh-cn/library/bb549430(v=vs.110).aspx