c 委託的常見用法

2022-09-26 01:51:12 字數 2684 閱讀 1935

此篇文章是我乙個小白對委託的理解和總結,請www.cppcns.com高手多多評判指教。

委託就是一種後期繫結機制,說的直白點就是在呼叫的時候才去傳遞業務邏輯的一種演算法。

委託的建立語法:

public delegate int comparison(t left, t right);//官方給出的定義泛型委託的demo

語法看似像宣告乙個變數或方法的簽名,但實現上是在宣告乙個型別。編譯器會生成乙個派生自system.multicastdelegate的類(而system.multicastdelegate派生自system.delegate),型別名與委託的名字相同,其中包含invoke 、begininvoke和endinvoke等方法。編譯器還為這個新型別生成新增和刪除處理業務,以便該類的客戶端可以在例項的呼叫列表中新增和刪除方法。

委託可以被定義在類的內部、命名空間下(與類同級)和全域性命名空間下(不推薦)。

//在全域性定義

public delegate int comparison(t left, t right);

namespace test

}委託的定義賦值

將委託當成類使用(委託本身就是乙個類)。

//定義委託

public delegate int comparison(t left, t right);

public class test

private int compare(int left, int right) => left.compareto(right);

}當用作委託的目標方法是「小方法」的情況下,通常使用lambda表示式語法來執行賦值:

comparison comparer = (left, right) => left.length.compareto(right.length);

多播委託

通常只是將單個目標方法附加到委託。但是,委www.cppcns.com託物件確實支援將多個目標方法附加到乙個委託物件的呼叫列表,稱為多播委託。多播委託意味著通過委託呼叫時可以呼叫多個方法,所以可以為委託附加多個方法。

private int cal(int num)

private void button1_click(object sender, eventargs e)

次執行" + a); return a + 1; };

action += cal;

action += a => 次執行" + a); return a + 3; };

action -= cal;

//如果有返回值的話,返回的是最後一次執行的結果

int a = action(5);

console.writeline(a);

}常用泛型委託

無返回值

public delegate void action();

public delegate void action(t arg);

public delegate void action(t1 arg1, t2 arg2);

// other variations removed for brevity.

有返回值

public delegate tresult func();

public delegate tresult func(t1 arg);

public delegate tresult func(t1 arg1, t2 arg2);

// other variations removed for brevity

返回bool型別

public delegate bool predicate(t obj);

注意:在.net core平台中,不支援委託目標方法的非同步呼叫(即不支援begininvoke方法):

action action = () => console.writeline("委託執行了");

asynccallback asynccallback = a => console.writeline("**執行了" + a);

is not supported on this platform.」

iasyncresult result = action.begininvoke(asynccallback, "asdf"); //委託啟動非同步呼叫

action.endinvoke(result);

event 事件

事件是帶event關鍵字的委託的例項,event可以限制被外部呼叫(invoke)和直接賦值(=)。委託是乙個型別,而事件是委託型別的乙個例項。

宣告乙個事件很簡單,只需在宣告乙個委託物件時加上event關鍵字就行。

///

/// 定義乙個委託

///

///

public delegate void showinfo(string name);

public class study

private void study_showinfo(string name)

}可以在用事件的地方用委託來替代,但事件有一系列規則和約束用以保證程式的安全可控,事件只有 += 和 -= 操作,這樣訂閱者只能有訂閱或取消訂閱操作,沒有許可權執行其它操作。如果是委託,那麼訂閱者就可以使用 = 來對委託物件重新賦值(其它訂閱者全部被取消訂閱),甚至將其設定為null,甚至訂閱者還可以直接呼叫委託,這些都是很危險的操作,廣播者就失去了獨享控制權。

事件保證了程式的安全性和健壯性。

C 委託的用法

委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞。事件是一種特殊的委託。1.委託的宣告 delegate 類 delegate是一種引用型別,我們在處理他的時候要當作類來看待而不是方法,說白了委託就是對方法或者方法列表的引用,呼叫乙個委託例項就好像是呼叫c 中的指標一 ...

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

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

c 的委託的用法

1.委託概述 委託是c 中新加入的乙個型別,可以把它想作乙個和class類似的一種型別,和使用類相似,使用乙個委託時,需要兩個步驟,首先你要定義乙個委託,就像是定義乙個類一樣 然後,你可以建立乙個或多個該委託的例項。定義乙個委託的語法是這樣的 public protected private del...