C 中常用的系統內建委託

2021-12-29 21:03:44 字數 3258 閱讀 6922

在公共語言執行時(clr)環境中系統為我們內建了一些常用的委託,包括action類的委託、func類的委託、predicate委託、comparison委託等等。以上這些委託的命名空間都是system,所屬程式集都是 mscorlib.dll,今天我就來講一講這些委託的使用方法。

就像我們自己已定義好的一樣,要實現某些功能,我們可以直接利用系統內建委託,例項化它們,而不必顯式定義乙個新委託並將命名方法分配給該委託。如:

複製**

public static void test()

static void main(string args)

複製**

只要了解了該系統內建委託是幹什麼的,傳什麼引數,返回什麼值,大家就可以仿上述例子自行呼叫,不再贅述。下面是我對這四類委託的總結,並附有結合匿名方法與lambda表示式的範例,兩種方法實現的結果一樣,大家可舉一反三,靈活運用。

一、action類的委託

1.action委託 封裝乙個方法,該方法不具有引數並且不返回值

2.action委託 封裝乙個方法,該方法只有乙個引數並且不返回值

3.action委託 封裝乙個方法,該方法具有兩個引數並且不返回值

…… ……

17.action委託 封裝乙個方法,該方法具有16個引數並且不返回值

下面以action委託為例,示範如何使用action類的委託,該類委託僅僅是引數個數上有區別而已。

複製**

static void main(string args)

;//將匿名方法分配給 action 委託例項

action concat1 = delegate(int i) ;

list.foreach(concat1);

//將 lambda 表示式分配給 action 委託例項

action 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委託 封裝乙個方法,該方法具有16個引數,並返回tresult引數所指定的型別的值

下面以func委託為例,示範如何使用func類的委託,該類委託僅僅是引數個數上有區別而已。

複製**

static void main(string args)

;//將匿名方法分配給 func 委託例項

func concat1 = delegate(int i) ;

var newlist1 = list.where(concat1).tolist();

//將 lambda 表示式分配給 func 委託例項

func 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委託

表示定義一組條件並確定指定物件是否符合這些條件的方法

下面給出predicate委託的範例:

複製**

static void main(string args)

;//將匿名方法分配給 predicate 委託例項

predicate concat1 = delegate(int i) ;

var newlist1 = list.findall(concat1);

//將 lambda 表示式分配給 predicate 委託例項

predicate 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委託封裝乙個方法,該方法傳入乙個型別引數,這個引數是指要比較的物件的型別,此型別引數是逆變,同時接收乙個引數(該引數就是要按照由此委託表示的方法中定義的條件進行比較的物件,引數的型別就是傳入的型別引數的型別),該方法始終返回bool型別的值。如果該物件符合由此委託表示的方法中定義的條件,則為 true;否則為 false。

四、comparison委託

表示比較同一型別的兩個物件的方法

下面給出comparison委託的範例:

複製**

static void main(string args)

;//將匿名方法分配給 comparison 委託例項

comparison concat1 = delegate(int i, int j) ;

//將 lambda 表示式分配給 comparison 委託例項

comparison 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

}

C 常用系統內建委託

net 自帶的委託有時真的非常方便.action無返回值 迭代操作 定義 public delegate void action t obj 多達16個泛型引數過載 使用 list.foreach c console.writeline c.id c.username func泛型返回 查詢 定義 ...

C 中常見的系統內建委託用法詳解

一般來說,c 在公共語言執行時 clr 環境中系統為我們內建了一些常用的委託,包括action類的委託 func類的委託 predicate委託 comparison l程式設計客棧t t 委託等等。以上這些委託的命名空間都是system,所屬程式集都是 mscorlib.dll,今天本文就來講一講...

MySQL中常用的內建系統函式

函式中可以將欄位名當作變數來用,變數的值就是該列對應的所有值 select concat id,is in name from cats 一 字串函式 php中用的函式,mysql中大部分也提供 1.concat s1,s2.sn 把傳入的引數連線成乙個字串 2.insert str,x,y,ins...