2009年6月15日

Filled Under: ,

Event Model in .NET

Share
在.NET中 ( C# and C++/CLI )

delegate可以想成 class of function pointer array

delegate void EventHandler( int arg );

等同於 C / C++中的

typedef void (*EventHandler)( int arg );


delegate是一種型別(class), 要宣告後才能使用.

eg. of C#

class Foo{
public:
EventHandler myEvent;
}

// class that recv event!
class Listener{
public void recvFunc( int arg ){
//print arg
}
}

// func that fire event!
void fireFunc(){

Foo myfoo = new Foo();
Listener listener = new Listener();
myfoo.myEvent += listener.recvFunc;
myfoo.myEvent( 5 );
}


這樣就會印出5

其實有了delegate 就可以實作event系統,
但event是幹嘛用的呢?

event 這個keyword是一個修飾詞 就像 const, static, virtual一樣,
他專門修飾delegate,
例如
class Foo{
//修飾  型別(class)  物件(object)
event EventHandler myEvent;
}



那event修飾了什麼?
如果delegate沒有event修飾, 它可以被物件外的程式碼呼叫,
例如前例的
myfoo.myEvent(5);

但加上event後則不能,
所以
myfoo.myEvent(5);

這一行compiler就不會過。
但是delegate仍可以被物件以外的程式嗎加掛 recv function
所以
myfoo.myEvent += listener.recvFunc;

還是合法的。

這樣的設計,
就好像說話,
只有我自己可以用我的嘴說話,
沒人可以用我的嘴說話, 不然會產生很多誤會。
但聽的人可以自由的告訴我, 他想聽什麼,
當我要說他想聽的東西的時候, 就會去跟他說。

0 Comments:

張貼留言