C#事件編程

來源:互聯網
上載者:User
開發時,我們幾乎無時無刻不用到事件。然而對於初級開發人員,包括我自己,大多數用的都是.net類庫中的事件。
先看看例子:            this.Load += new System.EventHandler(this.Page_Load);

這個估計是asp.net最常用的事件了。將Page對象的Load事件委託到Page_Load()方法進行處理。

看看各成員的類型:
this 是System.Web.UI.Page類型
this.Load 是System.EventHandler類型的事件event
物件瀏覽器對Page.Load的解釋public event System.EventHandler Load
    System.Web.UI.Control 的成員

摘要:
 當伺服器控制項載入到 System.Web.UI.Page 對象中時發生。  

SystemEventHandler 是一個delegate委託,原形是[C#]
[Serializable]
public delegate void EventHandler(
   object sender,
   EventArgs e
);

在mscorlib包,也就是.net基礎架構中。VS.net2003物件瀏覽器如是解釋public sealed delegate EventHandler : System.MulticastDelegate
    System 的成員

摘要:
 表示將處理不包含事件數目據的事件的方法。  

this.Page_Load是一個void方法

使用過程是這樣,所有事件相關的東西都要依賴於一個委託delegate,先聲明委託。delegate void SomeDelegate();
然後在類中定義一個該委託類型的事件:event SomeDelegate AnEvent;
在然後在對象執行個體化之後,事件發生之前(當然大部分是在建構函式中)將一個方法串連到委託
this.AnEvent += new SomeDelegate(this.EventRaise);
同時聲明一個方法
void EventRaise(){}
最後在需要引發事件的地方調用this.AnEvent()

看個例子    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            Test test = new Test();
        }
    }
    public delegate void GeneralEvent_Raise () ;

    public class Test
    {
        public event GeneralEvent_Raise GeneralEvent ;
        public Test()
        {
            GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
            GeneralEvent();
        }

        public void Test_GeneralEventRaise()
        {
            System.Console.WriteLine("Raise!");
        }
    }

代碼比較簡單,不詳細說了。這樣在運行時就會看到輸出“Raise!”。
看到+=突然產生興趣,既然不是直接用“=”,是不是可以把一個事件串連到多個委託
修改Test建構函式        public Test()
        {
            GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
            GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
            GeneralEvent();
        }

再運行看到什嗎?是的,一個事件引發了兩個處理。那麼如何去掉委託呢        public Test()
        {
            GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
            GeneralEvent = null;
            GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
            GeneralEvent();
        }

再看看,只觸發了一次。用什麼辦法制定只有一個委託處理事件呢            GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
            GeneralEvent = new GeneralEvent_Raise(Test_GeneralEventRaise);

仍然是一次。
不知道不給事件定委託是什麼樣子        public Test()
        {
            GeneralEvent();
        }

異常了吧。如果想自定異常可以這樣做            if ( GeneralEvent != null )
            {
                GeneralEvent();
            }
            else
            {
                throw new Exception("事件不會被處理!");
            }

在被依賴項目中定義好委託和事件,在下級項目中實現委託並把委託+到事件上,對於一些設計時未知的處理效果會相當好

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.