一般來說,c#在公共語言執行時(clr)環境中系統為我們內建了一些常用的委託,包括action類的委託、func類的委託、predicate委託、comparison&l程式設計客棧t;t>委託等等。以上這些委託的命名空間都是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)委託封裝封裝乙個不具有引數但卻返回 www.cppcns.comtresult 引數指定的型別值的方法
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)
; //將匿名www.cppcns.com方法分配程式設計客棧給 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);
lis程式設計客棧t.foreach(c => console.writeline(c.tostring()));
list.sort(concat2);
list.foreach(c => console.writeline(c.tostring()));
console.readkey();
#endregion
}總結:
comparison委託封裝乙個方法,該方法傳入乙個型別引數,這個引數是指要比較的物件的型別,此型別引數是逆變,同時接收兩個同型別的引數(這兩個引數就是要比較的兩個物件,引數的型別就是傳入的型別引數的型別),始終返回int型別的值,即乙個有符號整數,指示 x 與 y 的相對值,如下表所示。值含義
小於0x 小於y
0x 等於y
大於0x 大於y
本文標題: c#中常見的系統內建委託用法詳解
本文位址:
C 中常用的系統內建委託
在公共語言執行時 clr 環境中系統為我們內建了一些常用的委託,包括action類的委託 func類的委託 predicate委託 comparison委託等等。以上這些委託的命名空間都是system,所屬程式集都是 mscorlib.dll,今天我就來講一講這些委託的使用方法。就像我們自己已定義好...
c 委託的常見用法
此篇文章是我乙個小白對委託的理解和總結,請www.cppcns.com高手多多評判指教。委託就是一種後期繫結機制,說的直白點就是在呼叫的時候才去傳遞業務邏輯的一種演算法。委託的建立語法 public delegate int comparison t left,t right 官方給出的定義泛型委託...
C 常用系統內建委託
net 自帶的委託有時真的非常方便.action無返回值 迭代操作 定義 public delegate void action t obj 多達16個泛型引數過載 使用 list.foreach c console.writeline c.id c.username func泛型返回 查詢 定義 ...