1. 程式人生 > >C#中常見的系統內置委托用法詳解

C#中常見的系統內置委托用法詳解

dal lock 遞歸 ble sco 結合 靈活運用 並排 同時

一般來說,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表達式的範例,兩種方法實現的結果一樣,大家可舉一反三,靈活運用。


一、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個參數,參數類型皆為逆變,並且不返回值。


二、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,協變)有且只有一個,這個類型是此委托封裝的方法的返回值類型。


三、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。


四、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#程序設計有所幫助。除聲明外,跑步客文章均為原創,轉載請以鏈接形式標明本文地址
C#中常見的系統內置委托用法詳解

本文地址: http://www.paobuke.com/develop/c-develop/pbk23548.html






相關內容

技術分享圖片DevExpress GridView自動滾動效果技術分享圖片淺析C# 使用Process調用外部程序中所遇到的參數問題技術分享圖片C#遞歸算法之歸並排序技術分享圖片C# 設計模式系列教程-觀察者模式
技術分享圖片詳解C#中HashTable的用法技術分享圖片C#實現將Email地址轉成圖片顯示的方法技術分享圖片C#簡單生成縮略圖的方法技術分享圖片C#中is與as的區別分析

C#中常見的系統內置委托用法詳解