委託表示回調

敬告:本篇文章是我原創所寫,首發於 CSDN Blog,未經本人授權任何網站、公衆號、App 不允許轉載,授權的網站、公衆號、App 需明確標識本篇文章首發地址。需轉載請聯繫 [email protected]

回調是一種由服務端提供一部反饋的機制,它在某些情況下會涉及到多線程或者爲同步更新提供入口,在 C# 中如果要編寫良好的回調那麼就必須用委託來表示回調。委託我們經常用在事件處理的時候,我們也可以將委託用在其他地方,例如我們像以送傘的方式在類和類之間溝通的話,我們就可以使用委託,這是因爲委託可以定義類型安全的回調可以在運行的時候配置回調目標,並且可以向多個客戶端發出通知。
委託其實是一種對象,它包含指向方法的引用。所指向的方法既可以是靜態的又可以是實例方法,在程序運行時可以配置一個或多個客戶對象進行通信。

C# 爲我們提供了一種簡單的方法來使用委託和回調,這種方法就是 lambda 表達式 ,同時在 .NET 中很多委託形式使用的是 PredicateFunc<>Action<> 。在這三種定義委託的形式中第一種形式可以用第二種形式來替代,也就是說 Predicate 是用來判斷某條條件是否成立,而 Func 則會根據一些列參數求出某個結果,因此 Func<T,bool> 是等同於 Predicate 的。這裏要注意雖然第一種形式可以用第二種形式來替代,但是編譯器是不允許它們之間進行轉換的,因爲即使委託使用的是同一套參數和返回類型,編譯器也會按照兩個來計算。

Tip:我們常用的 LINQ 就是以委託爲基礎構建的,回調則用於處理 WPF 和 WinForm 中的跨線程封送。

在 C# 裏需要注意的是所有的委託都是多播委託,也就是說會把添加到委託中的所有目標函數都視爲一個整體去執行。那麼這就導致了兩個問題:

  1. 程序在執行這些目標函數時候很有可能發生異常,只要其中一個目標函數發生異常調用鏈就會中斷,進而導致後面剩餘的目標函數不被執行;
  2. 程序會把最後執行的目標函數的返回值作爲整個委託的返回值,忽略前面那些目標函數的返回值。

要解決上述問題我們可以手動來執行委託。由於每個委託都是一列表的形式來保存其中的目標函數的,因此只要在這個列表上迭代把每個目標函數執行一遍。

總結

如果要在程序運行時執行回調,那麼最好的辦法是使用委託。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章