C#中罕見的體系內置拜托用法詳解。本站提示廣大學習愛好者:(C#中罕見的體系內置拜托用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中罕見的體系內置拜托用法詳解正文
普通來講,C#在公共說話運轉時(CLR)情況中體系為我們內置了一些經常使用的拜托,包含Action類的拜托、Func類的拜托、Predicate<T>拜托、Comparison<T>拜托等等。以上這些拜托的定名空間都是System,所屬法式集都是 mscorlib.dll,明天本文就來說一講這些拜托的應用辦法。
就像我們本身已界說好的一樣,要完成某些功效,我們可以直接應用體系內置拜托,實例化它們,而不用顯式界說一個新拜托並將定名辦法分派給該拜托。如:
public static void Test() { Console.WriteLine("Just For Test"); } static void Main(string[] args) { Action a = new Action(Test); //直接實例化一個Action拜托,不消本身再界說新拜托 a(); }
只需懂得了該體系內置拜托是干甚麼的,傳甚麼參數,前往甚麼值,年夜家便可以仿上述例子自行挪用,不再贅述。上面是我對這四類拜托的總結,並附有聯合匿名辦法與Lambda表達式的典范,兩種辦法完成的成果一樣,年夜家可觸類旁通,靈巧應用。
1、Action類的拜托
1.Action拜托 封裝一個辦法,該辦法不具有參數而且不前往值
2.Action<T>拜托 封裝一個辦法,該辦法只要一個參數而且不前往值
3.Action<T1,T2>拜托 封裝一個辦法,該辦法具有兩個參數而且不前往值
…… ……
17.Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>拜托 封裝一個辦法,該辦法具有16個參數而且不前往值
上面以Action<T>拜托為例,示范若何應用Action類的拜托,該類拜托僅僅是參數個數上有差別罷了。
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 }
總結:
Action類的拜托起碼可以傳入0個參數,最多可以傳入16個參數,參數類型皆為逆變,而且不前往值。
2、Func類的拜托
1.Func(TResult)拜托封裝封裝一個不具有參數但卻前往 TResult 參數指定的類型值的辦法
2.Func(T,TResult)拜托 封裝一個具有一個參數並前往 TResult 參數指定的類型值的辦法
3.Func(T1,T2,TResult)拜托 封裝一個具有兩個參數並前往 TResult 參數指定的類型值的辦法
…… ……
17.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>拜托 封裝一個辦法,該辦法具有16個參數,並前往TResult參數所指定的類型的值
上面以Func<T,TResult>拜托為例,示范若何應用Func類的拜托,該類拜托僅僅是參數個數上有差別罷了。
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 }
總結:
Func類的拜托起碼可以傳入輸出泛型參數(in,逆變) 1個,最多可以傳入輸出泛型參數(in,逆變) 16個,傳入的輸入泛型參數(out,協變)有且只要一個,這個類型是此拜托封裝的辦法的前往值類型。
3、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 }
總結:
Predicate<T>拜托封裝一個辦法,該辦法傳入一個類型參數,這個參數是指要比擬的對象的類型,此類型參數是逆變,同時吸收一個參數(該參數就是要依照由此拜托表現的辦法中界說的前提停止比擬的對象,參數的類型就是傳入的類型參數的類型),該辦法一直前往bool類型的值。假如該對象相符由此拜托表現的辦法中界說的前提,則為 true;不然為 false。
4、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 }
總結:
Comparison<T>拜托封裝一個辦法,該辦法傳入一個類型參數,這個參數是指要比擬的對象的類型,此類型參數是逆變,同時吸收兩個同類型的參數(這兩個參數就是要比擬的兩個對象,參數的類型就是傳入的類型參數的類型),一直前往int類型的值,即一個有符號整數,指導 x 與 y 的絕對值,以下表所示。
值 寄義 小於0 x 小於y 0 x 等於y 年夜於0 x 年夜於y 願望本文所述對年夜家的C#法式設計有所贊助。