C#中常見的系統(tǒng)內(nèi)置委托用法詳解
一般來說,C#在公共語言運行時(CLR)環(huán)境中系統(tǒng)為我們內(nèi)置了一些常用的委托,包括Action類的委托、Func類的委托、Predicate<T>委托、Comparison<T>委托等等。以上這些委托的命名空間都是System,所屬程序集都是 mscorlib.dll,今天本文就來講一講這些委托的使用方法。
就像我們自己已定義好的一樣,要實現(xiàn)某些功能,我們可以直接利用系統(tǒng)內(nèi)置委托,實例化它們,而不必顯式定義一個新委托并將命名方法分配給該委托。如:
public static void Test() { Console.WriteLine("Just For Test"); } static void Main(string[] args) { Action a = new Action(Test); //直接實例化一個Action委托,不用自己再定義新委托 a(); }
只要了解了該系統(tǒng)內(nèi)置委托是干什么的,傳什么參數(shù),返回什么值,大家就可以仿上述例子自行調(diào)用,不再贅述。下面是我對這四類委托的總結(jié),并附有結(jié)合匿名方法與Lambda表達式的范例,兩種方法實現(xiàn)的結(jié)果一樣,大家可舉一反三,靈活運用。
一、Action類的委托
1.Action委托 封裝一個方法,該方法不具有參數(shù)并且不返回值
2.Action<T>委托 封裝一個方法,該方法只有一個參數(shù)并且不返回值
3.Action<T1,T2>委托 封裝一個方法,該方法具有兩個參數(shù)并且不返回值
…… ……
17.Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>委托 封裝一個方法,該方法具有16個參數(shù)并且不返回值
下面以Action<T>委托為例,示范如何使用Action類的委托,該類委托僅僅是參數(shù)個數(shù)上有區(qū)別而已。
static void Main(string[] args) { #region Action<T>委托示例 //需求:打印出整型集合list的元素 List<int> list = new List<int>() { 1, 2, 3, 4, 5 }; //將匿名方法分配給 Action<T> 委托實例 Action<int> concat1 = delegate(int i) { Console.WriteLine(i); }; list.ForEach(concat1); //將 lambda 表達式分配給 Action<T> 委托實例 Action<int> concat2 = (i => Console.WriteLine(i)); list.ForEach(concat2); Console.ReadKey(); #endregion }
總結(jié):
Action類的委托最少可以傳入0個參數(shù),最多可以傳入16個參數(shù),參數(shù)類型皆為逆變,并且不返回值。
二、Func類的委托
1.Func(TResult)委托封裝封裝一個不具有參數(shù)但卻返回 TResult 參數(shù)指定的類型值的方法
2.Func(T,TResult)委托 封裝一個具有一個參數(shù)并返回 TResult 參數(shù)指定的類型值的方法
3.Func(T1,T2,TResult)委托 封裝一個具有兩個參數(shù)并返回 TResult 參數(shù)指定的類型值的方法
…… ……
17.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>委托 封裝一個方法,該方法具有16個參數(shù),并返回TResult參數(shù)所指定的類型的值
下面以Func<T,TResult>委托為例,示范如何使用Func類的委托,該類委托僅僅是參數(shù)個數(shù)上有區(qū)別而已。
static void Main(string[] args) { #region Func<T,TResult>委托示例 //需求:查找整型集合list中大于3的所有元素組成的新集合,并打印出集合元素 List<int> list = new List<int>() { 1, 2, 3, 4, 5 }; //將匿名方法分配給 Func<T,TResult> 委托實例 Func<int, bool> concat1 = delegate(int i) { return i > 3; }; var newlist1 = list.Where(concat1).ToList(); //將 Lambda 表達式分配給 Func<T,TResult> 委托實例 Func<int, bool> concat2 = i => i > 3; var newlist2 = list.Where(concat2).ToList(); newlist1.ForEach(i => Console.WriteLine(i.ToString())); newlist2.ForEach(i => Console.WriteLine(i.ToString())); Console.ReadKey(); #endregion }
總結(jié):
Func類的委托最少可以傳入輸入泛型參數(shù)(in,逆變) 1個,最多可以傳入輸入泛型參數(shù)(in,逆變) 16個,傳入的輸出泛型參數(shù)(out,協(xié)變)有且只有一個,這個類型是此委托封裝的方法的返回值類型。
三、Predicate<T>委托
表示定義一組條件并確定指定對象是否符合這些條件的方法
下面給出Predicate<T>委托的范例:
static void Main(string[] args) { #region Predicate<T>委托示例 //需求:查找整型集合list中大于3的所有元素組成的新集合,并打印出集合元素 List<int> list = new List<int>() { 1, 2, 3, 4, 5 }; //將匿名方法分配給 Predicate<T> 委托實例 Predicate<int> concat1 = delegate(int i) { return i > 3; }; var newlist1 = list.FindAll(concat1); //將 lambda 表達式分配給 Predicate<T> 委托實例 Predicate<int> concat2 = (c => c > 3); var newlist2 = list.FindAll(concat2); newlist1.ForEach(i => Console.WriteLine(i)); newlist2.ForEach(i => Console.WriteLine(i)); Console.ReadKey(); #endregion }
總結(jié):
Predicate<T>委托封裝一個方法,該方法傳入一個類型參數(shù),這個參數(shù)是指要比較的對象的類型,此類型參數(shù)是逆變,同時接收一個參數(shù)(該參數(shù)就是要按照由此委托表示的方法中定義的條件進行比較的對象,參數(shù)的類型就是傳入的類型參數(shù)的類型),該方法始終返回bool類型的值。如果該對象符合由此委托表示的方法中定義的條件,則為 true;否則為 false。
四、Comparison<T>委托
表示比較同一類型的兩個對象的方法
下面給出Comparison<T>委托的范例:
static void Main(string[] args) { #region Comparison<T>委托示例 //需求:將整型集合list中的所有元素倒序排列打印出來 List<int> list = new List<int>() { 1, 2, 3, 4, 5 }; //將匿名方法分配給 Comparison<T> 委托實例 Comparison<int> concat1 = delegate(int i, int j) { return j - i; }; //將 lambda 表達式分配給 Comparison<T> 委托實例 Comparison<int> concat2 = (i, j) => j - i; list.Sort(concat1); list.ForEach(c => Console.WriteLine(c.ToString())); list.Sort(concat2); list.ForEach(c => Console.WriteLine(c.ToString())); Console.ReadKey(); #endregion }
總結(jié):
Comparison<T>委托封裝一個方法,該方法傳入一個類型參數(shù),這個參數(shù)是指要比較的對象的類型,此類型參數(shù)是逆變,同時接收兩個同類型的參數(shù)(這兩個參數(shù)就是要比較的兩個對象,參數(shù)的類型就是傳入的類型參數(shù)的類型),始終返回int類型的值,即一個有符號整數(shù),指示 x 與 y 的相對值,如下表所示。
值 | 含義 |
小于0 | x 小于y |
0 | x 等于y |
大于0 | x 大于y |
相關文章
C#調(diào)用Python程序傳參數(shù)獲得返回值
C# 調(diào)用 Python 程序有多種方式,本文主要介紹了4種方式,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02