Effective C# 用委託實現回調

來源:互聯網
上載者:User

委託屬於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屬於參考型別,而這個表單脫離了資料記錄就失去了意義,因此可以重載建構函式,在初始化表單的時候,把記錄傳遞給表單就行了。相對而言,後者會更簡單直接些。


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

對於第四個問題來說,可以借鑒表單的控制項事件初始化部分代碼,即委託的初始化採取就近原則,不過這不是唯一初始化的地方,這樣寫只是便於防止漏寫。

好了,對於委託大致說這麼多,希望對大家有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.