C 委託和事件

2022-02-20 07:02:44 字數 3122 閱讀 1803

一、是什麼

1)委託包含對方法而不是方法名稱的引用。使用委託可以在執行時動態設定要呼叫的方法,不知道方法名稱,也可以呼叫方法,執行(或呼叫)乙個委託將執行該委託引用的方法。

2)委託將名稱與方法的定義連線起來,即將方法的實現附加到該名稱。這樣便可以使用該名稱呼叫特定的方法。但是,委託要求方法的實現和委託必須具有相同的方法簽名(也就是說,他們應該具有相同數量/型別的引數),並有相同型別的返回值。

3)委託更像乙個具有通用的方法名稱,在不同的情況將該名稱指向不同的方法,並通過委託執行這些方法。

二、怎麼用

使用委託包括三個步驟:

1)定義委託

2)例項化委託

3)使用委託

class

program

public

int divide(int num1, int

num2)

} static

void main(string

args)

", result);

} }

值得說明是,

objcall = new call(objmath.mutiply);//例項化乙個委託  

objcall = objmath.mutiply; //直接給委託賦值

這兩種方式效果是一樣的,只是兩種不同的寫法。用.net reflector反編譯上述**,會發現其實objcall = objmath.mutiply最終還是會編譯生成objcall = new call(objmath.mutiply)。

上面的例子,我們再進一步,用匿名委託實現:

static

void main(string

args)

;//匿名委託

int result = objcall.invoke(3, 5);//

使用委託

console.writeline("

結果為

", result);//

輸出:結果為 15

}

我們還可以將:

int result = objcall.invoke(3, 5);//

使用委託

替換為:

int result = objcall(3, 5);//

使用委託

效果是一樣的。

再進一步,用lambda表示式進行簡化,可以將:

call objcall = delegate(int num1, int num2) ;//

匿名委託

替換為:

call objcall = (int num1, int num2) => ;//

lambda表示式

更簡化一步,變為:

call objcall = (num1, num2) => ;//

lambda表示式

這就是c#委託的進化過程以及c#lambda表示式對委託的支援。

三、什麼時候用

1)委託類似於c語言中的函式指標,可以將方法作為函式的引數進行傳遞

2)當不知道方法的具體實現時,就可以定義個委託,讓它替我們幹活

3)我們在程式設計時用的最多的就是事件註冊時使用。

比如:

this.button1.click += new eventhandler(button1_click);//

button1註冊click事件

private

void button1_click(object

sender, eventargs e)

可以看到方法button1_click作為引數傳遞給了eventhandler委託。

thread th = new thread(new threadstart(method));//

這裡的threadstart就是乙個委託,裡面可以直接傳乙個方法名method,以委託的形式呼叫方法

th.isbackground = true

; th.start();

四、典型應用

比如兩個窗體form1(乙個文字框,乙個按鈕)、form2(乙個文字框,乙個按鈕)之間進行傳值,form1到form2可以通過建構函式傳值,但如果要將form2的值傳回給form1該怎麼辦呢?這裡就可以用到委託,這也是委託的經典應用場景之一。

form1.cs部分**:

private

void button1_click(object

sender, eventargs e)

void form2_showdelegateeventhandler(string

text)

form2.cs部分**:

public

delegate

void showdelegate(string text);//

宣告委託

public

event showdelegate showdelegateeventhandler;//

宣告事件

public

string text;//

public變數

public showdelegate delegateshow;//

public委託變數

private

void form2_load(object

sender, eventargs e)

private

void button1_click(object

sender, eventargs e)

五、總結

1)委託是方法的簽名,可以將委託作為方法的引數進行傳遞

2)事件基於委託,或者說事件是特殊的委託

3)委託可以用匿名委託簡化**(不需要再宣告委託,然後實現),還可以用lambda表示式進一步簡化匿名委託(這也是c#推薦的方式)。

C 事件和委託

c 程式設計中的事件驅動是說應用程式的執行流程是由外界發生的事件確定的。也就是接受到任務再工作的模式。事件是乙個訊號,它告知應用程式有重要的事情發生。真正的執 況是,各個應用程式把負責不同功能的物件在其執行期間送入windows作業系統,讓這些物件等待windows產生事件。然後加以處理,windo...

C 委託和事件

什麼是委託?委託和事件這兩個概念是完全配合的。委託僅僅是函式指標,那就是說,它能夠引用函式,通過傳遞位址的機制完成。委託是乙個類,當你對它例項化時,要提供乙個引用函式,將其作為它建構函式的引數 先看示例 例中先申明乙個委託,例如 public delegate void somedelegate s...

C 委託和事件

要為類構造乙個事件,必須用 event 來宣告乙個 delegate 型的字段,如 puclic calss test 在建立類的例項後定義這個 load 事件 test m new test m.load new eventhandler m load void m load object sen...