有很多同學在學習c#的委託和事件時,都一頭霧水,有的不理解委託和事件到底是什麼東西,有的理解了概念,但不知道在什麼場景中應該應用委託和事件,今天我們就一起總結下委託和事件的知識點:
【委託】
我們先從字面上理解委託,就是將事情託付給別人做,而非自己親自做,自己只負責通知。
巨集觀上來看,委託就是一種通知機制,通知者需要做某事時,發起通知(invoke),委託列表的訂閱者得到通知,委託列表中的方法被順序執行。
委託還可以理解成一種容器,容器裡放的是函式方法,如:
delegate void fun(int a,int b);
上句定義了乙個委託fun,它有兩個輸入引數:a,b;返回引數為 void。
可以使用+=,=,-=往委託容器裡新增或移除方法。
使用fun.invoke(a,b)或fun(a,b)觸發委託,會將容器裡的所有方法呼叫一遍。
有的同學可能覺得委託沒什麼用,不就是傳個方法名,然後委託invoke後再順序執行方法嗎,我按順序乙個個執行方法不也一樣嗎?其實,在c#中,因為取消了指標,很多事情,只能靠委託來完成,比如,在a類中例項化了b類,那a類中可以b類的資料,但b類卻拿不到a類的資料,這時就需要在b類中宣告乙個委託,然後在a類中註冊,這樣b類委託被執行時,就可以拿到a類的資料了。
【事件】
委託和事件的關係,類似於 欄位和屬性的關係。事件內部封裝了乙個委託,並對其進行了一些訪問限制。
限制1:事件只能在定義類中invoke;
例如:在b類定義委託,因為需在其他類中註冊,通常將委託定義成public的,那麼在其他類中,就可以呼叫委託的invoke,這樣就"冒充通知」,因為b才是真正的通知者。這在某些嚴格場景下是被允許的,那麼此時使用事件就可以解決這個問題。
限制2:事件只能用+=,-=註冊或移除方法列表;
委託可以使用=來註冊方法,這樣之前註冊的方法將被覆蓋,可能會導致問題。事件則杜絕了這種錯誤。
c 委託和事件再理解
委託 c 中的委託類似於 c 或 c 中的函式指標。使用委託使程式設計師可以將方法引用封裝在委託物件內。然後可以將該委託物件傳遞給可呼叫所引用方法的 而不必在編譯時知道將呼叫哪個方法。與 c 或 c 中的函式指標不同,委託是物件導向 型別安全的,並且是安全的。委託宣告定義一種型別,它用一組特定的引數...
C 委託和事件的理解
委託 private delegate string getastring 委託的定義,使用delegate關鍵字 兩種指向方法的寫法 getastring a new getastring x.tostring a指向了x中的tostring方法 getastring a x.tostring 兩...
理解C 中的委託和事件
csdn論壇,由於對方也是 所以源作者不詳 有許多人問的,net中的委託以及事件處理。我拿簡單的例子說明一下,是現實中的例子。比如說 乙個公司 場景 你是老闆,手下有兩個員工,小張和小王。你命令小王,如果小張玩遊戲,則小王扣去小張500元錢。這就是現實中的委託。實際上,在寫程式中,程式設計師就是老闆...