發表文章

目前顯示的是有「C#」標籤的文章

[C# IN DEPTH筆記] 003 委派(Delegate)的合併與移除

引動清單(Invocation List)或是引動 過程 清單 是用來記錄委派實體用的,並會依照所 加入的順序執行。"引動"念起來怪怪的,我猜應該是" 引 發 動 作"的縮寫吧!因此, 一個委派變數可以接受多個委派實體,而用來記錄這些實體的就是引動清單。 引動清單可以重複加入相同的委派實體,而這些實體間是具有順序性的。 C#語言規格:「 對於委派執行個體的引動清單包含多個項目,其引動過程乃是以 同步 、一一叫用引動過程清單上的每一個方法來進行。 」 C#語言規格:「 引動過程清單中可重複出現某個委派 」 每個委派實體中都會有一份引動清單,而清單內容的新增移除是利用 System.Delegate類別 中的 Combine 與 Remove 這兩個靜態方法;但常見使用的方法是 利用運算子「+、 += 」與「-、 -= 」來做新增與移除的動作。 委派實體也接受與空值( null )合併,並且會建立一個新的引動清單。當引動清單內 無任何委派實體時,則會回傳null。 C#中,使用運算子合併或刪除委派的轉換: x += y → x = x + y → x = Delegate.Combine(x,y) x -= y → x = x - y → x = Delegate.Remove(x,y) 利用運算子(+、-、+=、-=)委派新增與移除之範例: 委派運算 z最終結果 (引動清單內容) 備註 z += [a] [a] z = [a] + [b] [a,b] z = null + [a] + null [a] null 為空清單 z = [a] + [b] + [c] – [b] [a,c] z = [a,b] + [b,c] [a,b,b,c] z = [a,b,c,d,b,c] - [b,c] [a,b,c,d] 會從最後加入的開始移除 z = [a] - [b] [a] 不會移除不存在的項目 z = [a,b,c,d,e] - [a,c,e] [a,b,c,d,e] 要移除的清單項目必須 完全符合