日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

《Effective C#》Item 21:用委托实现回调

發布時間:2023/12/2 C# 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Effective C#》Item 21:用委托实现回调 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

委托屬于C#中的新名詞,它的應用也非常廣泛,例如事件就是委托最簡單而又直接的例子。

?

那么首先說說什么是委托,其實委托在用過C或者C++的人看來就是函數指針,不過使用C#的大多數人都沒有用過這兩門語言,因此對委托的理解不是很深,對于委托可以簡單的從字面去理解,即“委托別人去執行某些操作”,也就是說執行一個操作,而這個操作過程自身并不知道,只是委托過來讓你去執行而已。

參看如下這個例子。

??? public delegate void HelloHandler( string Msg );

??? private void SayHello( string sMsg )

??? {

??????? MessageBox.Show( sMsg );

??? }

??? // delegate sample

??? HelloHandler hHello = new HelloHandler( SayHello );

??? hHello( "Hello World!" );

?

例子很明顯,在執行hHello的時候,并不知道具體的過程是什么樣的,只是去執行而已。

現在要說說委托能做些什么,那么先來分析一下事件,這也是委托用得最多的地方。一般事件的初始化需要綁定一個事件處理函數,那么當事件觸發的時候,處理函數會被調用,也就是說在事件處理函數可以明確的知道,此事件是被觸發了。例如,點擊窗體的上的Button,它會把Click事件反饋給窗體。很明顯,委托是處理對象之間的信息交互。除了事件外,委托的大多用處都和此類似,那么這樣使用的好處在于降低對象之間耦合性。

?

其次委托不同于以前函數指針的地方在于,可以綁定多個委托函數,例如:

??? public delegate void HelloHandler( string Msg );

??? private void WriteHello1( string sMsg )

??? {

??????? Debug.WriteLine( "WriteHello1:" + sMsg );

??? }

??? private void WriteHello2( string sMsg )

??? {

??????? Debug.WriteLine( "WriteHello2:" + sMsg );

??? }

??? // delegate sample

??? HelloHandler hHello = new HelloHandler( WriteHello1 );

??? hHello += new HelloHandler( WriteHello2 );

??? hHello( "Hello World!" );

?

不過在這種情況下,由于綁定到委托上的函數是按照順序執行的,所以有兩個潛在的問題。

第一個問題,當一個函數執行過程中產生異常,導致后面的不能進行執行。就上面的例子而言,如果在“WriteHello1”函數中出現異常,會導致“WriteHello2”不能被執行。

另一個問題,就是委托執行的返回值,當綁定多個函數,委托執行的返回值是最后一個綁定函數執行后的返回值,那么通過這個值去做判斷將會是不正確的。

那么對于委托綁定多個函數,要注意的是不要把異常擴散出來,其次委托類型的返回值為“void”。

?

如何去使用委托,很多人看了書上的例子,也知道委托的意義,但是無法把它和實際應用進行結合。那么在使用委托的時候,首先要明白幾個問題,等各個問題清楚了,委托原型也就自然出來了。

需要分析清楚的問題有如下幾點。

問題一,傳遞信息是什么,傳遞的時機是否固定,一次傳遞還是多次傳遞;

問題二,用委托是否合適;

問題三,哪一方是委托的調用端,而哪一方是委托的初始端;

問題四,委托的初始化放在哪里比較合適。

?

問題一是關鍵,這首先決定是否要使用委托來實現,其次如果要使用委托,那么需要確定委托函數類型。

對于問題二來說,很多人可能就不解了。沒錯,委托是可以降低類型之間的耦合性,但是能起到這種作用的并不是只有委托這一種方法。很多情況下,用重載構造函數即可以達到這一目的,因此想問題的時候,不能局限于此。例如,很多人都做過彈出一個單獨窗體對某一條記錄進行修改,這里用委托可以實現,但是考慮到DataRow屬于引用類型,而這個窗體脫離了數據記錄就失去了意義,因此可以重載構造函數,在初始化窗體的時候,把記錄傳遞給窗體就行了。相對而言,后者會更簡單直接些。

有了前兩個問題的分析,不少人在寫委托的時候,會把順序寫反了,因此程序執行的效果并不是設想中的那樣,這一點要尤為注意。

對于第四個問題來說,可以借鑒窗體的控件事件初始化部分代碼,即委托的初始化采取就近原則,不過這不是唯一初始化的地方,這樣寫只是便于防止漏寫。

?

好了,對于委托大致說這么多,希望對大家有所幫助。

?

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/Knight94/archive/2006/11/15/1385284.aspx

轉載于:https://www.cnblogs.com/Sue_/articles/1656797.html

總結

以上是生活随笔為你收集整理的《Effective C#》Item 21:用委托实现回调的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。