action 是.net類庫從3.0開始新增的內建委託,用於實現對無返回函式的呼叫。以下示例定義了乙個action,在使用已經有函式show賦值後,再進行呼叫。
public
override
void
test()
public
void
show
(string s)
既然action類是用於表示函式的,那麼函式的引數列表和返回型別就很重要,關於這兩點action類規定如下:
返回型別必需為void,即不返回任何值。這也是為什麼這類函式被稱之為action(即運作)的原因了。
引數列表型別不限制,長度最多為16。補充一句,這個資料是微軟在調查了windows底層**得出的來的,即16個足夠滿足所有需求(如果極端情況不夠用,那麼就是設計問題,因為部分引數一定可以合併為乙個類,然後再進行呼叫)。以下是1-16個引數的action定義。從定義來看,本質上也就是使用delegate
關鍵字定義的普通委託。
public
delegate
void
action
<
t1>
(t1 t1)
;public
delegate
void
action
t2>
(t1 t1,
t2 t2);.
..public
delegate
void
action
<
int1,in
t2,int3,in
t4,int5,in
t6,int7,in
t8,int9,in
t10,
int11,in
t12,
int13,in
t14,
int15,in
t16>
(t1 arg1,
t2 arg2,
t3 arg3,
t4 arg4,
t5 arg5,
t6 arg6,
t7 arg7,
t8 arg8,
t9 arg9,
t10 arg10,
t11 arg11,
t12 arg12,
t13 arg13,
t14 arg14,
t15 arg15,
t16 arg16)
;
委託的初始化有以下三種方式:
如下所示。
public
override
void
test()
// 3.通過lambda
action<
string
> act3 = s =
> console.
writeline
(s);
}public
void
show
(string s)
在直接使用函式名稱賦值時,可以非常方便地直接將已經定義好的函式名稱賦值給action變數即可。對於一些基本不需要復用的操作,可以直接使用匿名函式來定義。
在完成了以上的定義以後,我們可以使用以下**進行函式呼叫。
// 呼叫**
act1
("hello");
act2
("hello"
);
我們可以看到,呼叫方式就是直接使用定義好的action物件以函式名的方式進行引數呼叫。這個過程,就象是僅僅換了乙個名稱一樣。本質上來說,這是兩個不同的引用,指向相同的物件,可以理解為c++中的指標(事實上也確實如此)。
本文介紹了action類,用於對無引數的函式進行委託呼叫。它最多支援16個引數,可以滿足所有的需求。
C 委託基礎 泛型委託Action
c 委託基礎系列原於2011年2月份發表在我的新浪部落格中,現在將其般至本部落格。為了方便開發,net基類庫針對在實際開發中最常用的情形提供了幾個預定義好的委託,這些預定義委託用得很廣,比如在編寫lambda表示式和開發平行計算程式時經常要用到他們 對於函式返回值為空的情形,可以使用action泛型...
C 委託機制
c 的委託機制,實際上相當於函式的指標。如下例項 1 定義乙個類 class person string name public void person this.name name private virtual void eat food food 在該類中定義了乙個eat方法。對該物件進行例項...
C 委託機制
委託在c 中應用非常廣泛。最近初學c 記錄 delegate 一般語法 首先宣告delegate public delegate void boilhandler int param 相比普通方法 public float scrollvalue 形式上只是多了乙個標誌 delegate而已。其實可...