C 委託與事件的區別

2021-06-20 14:56:05 字數 3564 閱讀 3261

事件是利用委託來申明的,因此先解釋委託。委託是乙個類,它與其他類如int,string等沒有本質區別,int代表的是所有的整形,而string代表的是字串,委託則代表的是一類方法,這類方法具有相同返回型別和相同引數。委託的定義:

public delegate void calculatorhandler(int x,int y);

calculatorhandler

這個委託的定義可以看出,它反應的是一類方法,這類方法的返回型別是

void

,兩個引數是

(int x,int y)

,因此以後所有具有這樣特徵的方法都可以用這個委託來代替,現有以下這個方法:

static void add(int x, int y)

",x+y);

}

首先要將這個方法賦值給這個委託才可以使用,就如普通的類賦值一樣,

calculatorhandler calhandler = new calculatorhandler(add)

當然你也可以像給乙個整形賦值一樣,這樣賦值:

calculatorhandler calhander = add;

當要呼叫這個方法的時候,你可以就像使用方法一樣使用委託,

calhander(3,4);

委託也可以繫結多個方法,當呼叫這個委託時,會呼叫所有已經繫結了的方法,如現在還有這樣的方法:

static void multiply(int x, int y)

",x*y);

}

只需在calhandler基礎上多繫結個方法,具體語法:

calhander += multiply;

這樣當呼叫

calhander(3,4);

會同時呼叫

add和multiply

這兩個方法,你也可以利用「

-=」解綁方法:

calhander -= multiply;

這樣再次呼叫這個委託,則只會呼叫

add這個方法。

一說到事件總會有發布者(

publisher

)和訂閱者(

subscriber),

發布者定義了乙個事件,訂閱者訂閱該事件(指的是當該事件觸發時,訂閱者做出什麼樣的反應,即利用相應的函式去處理)。該函式的定義與定義該事件的委託配套。**如下:

public delegate void messageeventhandler();

class publisher

public void onmessageevent()}}

class subscriber

public void response()

} class program}}

這就是事件的基本用法,但是事件與委託到底有什麼區別呢,從上面的**可以看出,事件是根據委託來定義的,

public event messageeventhandlermessageevent

,其實它是利用委託來規定訂閱者處理函式的型別(相同的返回型別和引數即為一類),然後可以方便在發布者自身的類中來觸發訂閱者的一些方法。

但是為什麼要事件呢,要實現這些,我僅用委託也可以實現呀,如下**:

public delegate void messageeventhandler();

class publisher

public void onmessageevent()}}

class subscriber

public void response()

}class program

}

這樣子也同樣可以產生相同的結果。

但是當客戶端如下呼叫呢?

publisher p = new publisher();

subscriber s = new subscriber(p);

p.dosomething();

p.messageevent();

console.readkey();

客戶端是不是能隨意讓發布者產生事件,這個只有神才能做到呀!因此我們可否將發布者的委託定義為

private

,因為只有發布者的內部才能觸發事件嘛,其他人怎麼可以?但是這樣訂閱者就無法訂閱了,那我們是否可以增加繫結可解除的函式來訂閱此委託呢?

public delegate void messageeventhandler();

class publisher

public void onmessageevent()

}public void add_messageevent(messageeventhandler m)

public void reomove_messageevent(messageeventhandler m)

}class subscriber

public void response()

}class program}}

這樣就可以實現與事件一樣的功能,因此為了方便微軟為我們提供了事件訪問器,何為事件訪問器?

public delegate void messageeventhandler();

class publisher

}remove}}

public void dosomething()

public void onmessageevent()}}

class subscriber

public void response()

}class program

}

以上的**就是利用事件訪問器來讓委託繫結訂閱者的方法,事件訪問器中的

add和

remove

能自動編譯為+=和

-=。通過

reflector

,我們可以看到乙個事件是如何定義的:

它是申明乙個私有的委託

private messageeventhandlermessageevent;

另外利用兩個函式來繫結與解除訂閱者的方法。

委託與事件的區別

用乙個公司的場景來說明。假如你是乙個公司的老闆,手下有兩名員工 有點少,呵呵 小張和小王。你給了小王乙個這樣的特權 如果小張玩遊戲,你就可以扣小王500元錢。這就是現實中的委託。在寫程式中,程式設計師就是老闆,小張和小王就是兩個物件。小張玩遊戲是乙個方法,小張還有乙個遊戲事件,他玩遊戲激發這個事件。...

委託與事件的區別

使用事件的 定義乙個類 class foo 定義乙個方法,呼叫委託 public void action class program 使用委託的方法 class foo 執行乙個方法方法 public void action class program 區別一 event可以多播 class foo...

C 委託與事件有啥區別?

一.委託和事件的差別在哪?請各位思考乙個問題,委託與事件功能幾乎相同,委託能幹的事件也能幹,反之亦然。那為啥還要分別弄出兩個來呢?如果你是在學校學的暈頭轉向的可憐兄弟,那就繼續c 教程往下看吧,別直接跳到三了 二.委託 說的直白一點,你可以把委託當c 中的函式指標來用。同返回值型別,同引數列表。舉個...