[C# 基礎知識系列]專題五:當點擊按鈕時觸發Click事件背後發生的事情

來源:互聯網
上載者:User

引言:

 當我們在點擊視窗中的Button控制項VS會幫我們自動產生一些代碼,我們只需要在Click方法中寫一些自己的代碼就可以實現觸發Click事件後我們Click方法中代碼就會執行,然而我一直有一個疑問的——既然上一專題中說事件是一個多播委託,然而自動產生的程式碼中只有事件的執行個體化,卻沒有看到事件的調用,那既然沒有事件調用的代碼,那封裝的Click為什麼會執行呢?

一、點擊按鈕時觸發Click事件背後發送的事情

在引言中提出了我的提問的, 我相信有些朋友可能也會有這樣的疑問的,然後事件肯定是調用了的, 只是不是我們代碼中調用,而是Butoon控制項的內部代碼裡面調用了事件,而導致委託封裝的Click方法而被調用,這樣才符合我們看到的情況的——我們點擊按鈕後,我們後台代碼中的Click方法就會執行。為了明白到底背後發生了什麼事情的, 讓我們一起來探究個究竟吧?

我們建立一個Windows 表單程式,然後在表單中拖入一個Button控制項並單擊按鈕,這時候VS為我們產生了如下的代碼:

 private System.Windows.Forms.Button button1; private void InitializeComponent()        {            his.button1 = new System.Windows.Forms.Button();        this.button1.Location = new System.Drawing.Point(105, 89);            this.button1.Name = "button1";            this.button1.Size = new System.Drawing.Size(75, 23);            this.button1.TabIndex = 0;            this.button1.Text = "請點擊我";            this.button1.UseVisualStyleBackColor = true;            this.button1.Click += new System.EventHandler(this.button1_Click);}// 後台代碼  private void button1_Click(object sender, EventArgs e)        {        }

從上面代碼中我們看到VS為我們自動建立了一個Button對象並執行個體化,設定了它的屬性並通過 this.button1.Click += new System.EventHandler(this.button1_Click);這行代碼把 button1_Click註冊對Click事件的關注,然而事件的調用代碼在哪裡呢? 下面我們就在button1_Click方法裡面設定斷點看看代碼是如何執行的(通過查看呼叫堆疊來看看代碼的執行順序),下面是我設定斷點的一張呼叫堆疊:

從中我發現在調用button1_Click方法之前要執行Control.OnClick(System.EventArgs e)方法的,然後我們用發射工具去查看下Control.OnClick(System.Eventrgs e)方法中具體有什麼樣的代碼:OnClick方法內部代碼為:

從反射的代碼中可以明白,首先從Events(大家可以通過反射工具去查看Events的類型,它的類型為EventHandlerList,而EventHandlerList又是一個密封類)委託集合中取出委託,如果Click事件(委託)執行個體化了的話,此時就不為空白,此時就會調用委託——handler(this, e),我們知道之前我們通過 this.button1.Click += new System.EventHandler(this.button1_Click);代碼執行個體化了委託事件,所以此時被EventHandler封裝的button1_Click方法就會執行。

通過上面的解釋我已經解除了我一開始的疑惑了,事件的調用在.Net類庫中的Control.OnClick方法裡面調用,這也就是我說要表達的Click事件背後做的事情的
下面是反射得到的Click事件的代碼:

 

二、小結

本專題首先提出我對按鈕單擊事件背後發生的事情的疑惑,通過調試和反射工具一步一步把疑惑接觸,相信其他控制項的其他事件也是如此的,本專題主要想讓大家知道下.Net類庫為我們做的事情的,希望一些初學者們瞭解知識時,要努力知道事物的本質。最後希望本專題可以讓大家更進一步的理解事件的本質的,我將下一專題和大家分享下我理解的泛型到底是怎樣的。

反射工具的:http://files.cnblogs.com/zhili/Reflector.zip

 

 

聯繫我們

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