1. 程式人生 > >c# 委託和事件

c# 委託和事件

剛剛我看了以上各位的留言回覆,我說一下自己的看法,可能和裝配腦袋的看法有些出入:

首先,event和委託的區別不在於是誰封裝了誰,而是它們兩者之間就根本沒有可比性。
event是一個修飾符,delegate是一個類。就好像static修飾符和String型別,它們有什麼可比性?

宣告一個事件的時候,
public event delegate eventname;
只是告訴宣告這個委託是以事件的形式宣告的。
以event修飾符宣告一個委託之後,該委託變數就可以使用+=或者-=過載運算子了。
比如,不使用event來實現的類似於事件的方法:
using System;
using System.Collections.Generic;
using System.Text;

namespace PrintTemplate
{
    
publicdelegatevoid DelSample(object sender,EventArgs e);

    
publicclass Test
    
{
        
public DelSample eventsample;
        
publicvoid Run()
        
{
            eventsample.Invoke(
thisnew EventArgs());
        }

    }


    
publicclass Voke
    
{
        
public Voke()
        
{
            Test test 
=new Test();
            test.eventsample 
= OnClick;
            test.Run();
        }

        
publicvoid OnClick(object sender,EventArgs e)
        
{
            
        }

    }

}

注意的是,上面這個例子,並沒有使用event修飾符,同樣達到了使用修飾符event的效果。(或者說是使用修飾符event達到了上面的效果更恰當一些吧。)
呼叫時,test.eventsample是作為一個test物件的一個公共變數來對其賦值的。只有對其符了值,在test.Run()時,才可以正確的呼叫該委託的方法。這個是完全符合我們平時編碼習慣的。不少人搞不清event的機制原理看了這個應該就明白了。

而使用event修飾符來完成這個操作的程式碼:
using System;
using System.Collections.Generic;
using System.Text;

namespace PrintTemplate
{
    
publicdelegatevoid DelSample(object sender,EventArgs e);

    
publicclass Test
    
{
        
publicevent DelSample eventsample;
        
publicvoid Run()
        
{
            eventsample.Invoke(
thisnew EventArgs());
        }

    }


    
publicclass Voke
    
{
        
public Voke()
        
{
            Test test 
=new Test();
            test.eventsample 
+=new DelSample(OnClick);
            test.Run();
        }

        
publicvoid OnClick(object sender,EventArgs e)
        
{
            
        }

    }

}

從這個例子不難看出,和上面未使用event的例子,完成的作用完全是一模一樣的。但是MS肯定不會平白無故的就添這麼一個東西出來。就我目前來看,應該是為了更好的多繫結委託才實現的。上面裝配腦袋所說的Delegate.combin(delegate,delegate)和Delegate.Remove(...),同樣也可以完全取代event完成的這個效果,但顯然不如使用event修飾符來的直觀一些。

所以說,event是為了方便delegate才由MS弄出來這麼一個東西,它是為後者服務的,有了它,你可以更加方便的使用委託,提高你的工作效率。
至於修飾符到底是什麼東西,什麼工作機制,恕我直言,我現在還真沒有搞清楚,可能它是為編譯器工作的,在編譯的時候,根據某種規則編碼機器語言的吧。這個你可以不相信我。

現在在上班,沒時間寫的很詳細,大概講一下。有什麼問題,可以回覆或者去我的blog裡面給我留言,大家一起討論。