真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

[C#基礎(chǔ)知識(shí)梳理系列]專題五:當(dāng)點(diǎn)擊按鈕時(shí)觸發(fā)Click事件背后發(fā)生的事情

引言:

成都創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元西雙版納做網(wǎng)站,已為上家服務(wù),為西雙版納各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

當(dāng)我們?cè)邳c(diǎn)擊窗口中的Button控件VS會(huì)幫我們自動(dòng)生成一些代碼,我們只需要在Click方法中寫一些自己的代碼就可以實(shí)現(xiàn)觸發(fā)Click事件后我們Click方法中代碼就會(huì)執(zhí)行,然而我一直有一個(gè)疑問(wèn)的——既然上一專題中說(shuō)事件是一個(gè)多播委托,然而自動(dòng)生成的代碼中只有事件的實(shí)例化,卻沒(méi)有看到事件的調(diào)用,那既然沒(méi)有事件調(diào)用的代碼,那封裝的Click為什么會(huì)執(zhí)行呢?

一、點(diǎn)擊按鈕時(shí)觸發(fā)Click事件背后發(fā)送的事情

在引言中提出了我的提問(wèn)的, 我相信有些朋友可能也會(huì)有這樣的疑問(wèn)的,然后事件肯定是調(diào)用了的, 只是不是我們代碼中調(diào)用,而是Butoon控件的內(nèi)部代碼里面調(diào)用了事件,而導(dǎo)致委托封裝的Click方法而被調(diào)用,這樣才符合我們看到的情況的——我們點(diǎn)擊按鈕后,我們后臺(tái)代碼中的Click方法就會(huì)執(zhí)行。為了明白到底背后發(fā)生了什么事情的, 讓我們一起來(lái)探究個(gè)究竟吧?

我們新建一個(gè)Windows 窗體程序,然后在窗體中拖入一個(gè)Button控件并單擊按鈕,這時(shí)候VS為我們生成了如下的代碼:

[C# 基礎(chǔ)知識(shí)梳理系列]專題五:當(dāng)點(diǎn)擊按鈕時(shí)觸發(fā)Click事件背后發(fā)生的事情
 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 = "請(qǐng)點(diǎn)擊我";
   this.button1.UseVisualStyleBackColor = true;
   this.button1.Click += new System.EventHandler(this.button1_Click);
}// 后臺(tái)代碼
  private void button1_Click(object sender, EventArgs e)
        {

        }
[C# 基礎(chǔ)知識(shí)梳理系列]專題五:當(dāng)點(diǎn)擊按鈕時(shí)觸發(fā)Click事件背后發(fā)生的事情

從上面代碼中我們看到VS為我們自動(dòng)創(chuàng)建了一個(gè)Button對(duì)象并實(shí)例化,設(shè)置了它的屬性并通過(guò) this.button1.Click += new System.EventHandler(this.button1_Click);這行代碼把button1_Click注冊(cè)對(duì)Click事件的關(guān)注,然而事件的調(diào)用代碼在哪里呢? 下面我們就在button1_Click方法里面設(shè)置斷點(diǎn)看看代碼是如何執(zhí)行的(通過(guò)查看調(diào)用堆棧來(lái)看看代碼的執(zhí)行順序),下面是我設(shè)置斷點(diǎn)的一張調(diào)用堆棧截圖:

[C# 基礎(chǔ)知識(shí)梳理系列]專題五:當(dāng)點(diǎn)擊按鈕時(shí)觸發(fā)Click事件背后發(fā)生的事情

從上圖中我發(fā)現(xiàn)在調(diào)用button1_Click方法之前要執(zhí)行Control.OnClick(System.EventArgs e)方法的,然后我們用發(fā)射工具去查看下Control.OnClick(System.Eventrgs e)方法中具體有什么樣的代碼:OnClick方法內(nèi)部代碼截圖為:

[C# 基礎(chǔ)知識(shí)梳理系列]專題五:當(dāng)點(diǎn)擊按鈕時(shí)觸發(fā)Click事件背后發(fā)生的事情

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

通過(guò)上面的解釋我已經(jīng)解除了我一開(kāi)始的疑惑了,事件的調(diào)用在.Net類庫(kù)中的Control.OnClick方法里面調(diào)用,這也就是我說(shuō)要表達(dá)的Click事件背后做的事情的
下面是反射得到的Click事件的代碼截圖:

[C# 基礎(chǔ)知識(shí)梳理系列]專題五:當(dāng)點(diǎn)擊按鈕時(shí)觸發(fā)Click事件背后發(fā)生的事情

 

二、小結(jié)

本專題首先提出我對(duì)按鈕單擊事件背后發(fā)生的事情的疑惑,通過(guò)調(diào)試和反射工具一步一步把疑惑接觸,相信其他控件的其他事件也是如此的,本專題主要想讓大家知道下.Net類庫(kù)為我們做的事情的,希望一些初學(xué)者們了解知識(shí)時(shí),要努力知道事物的本質(zhì)。最后希望本專題可以讓大家更進(jìn)一步的理解事件的本質(zhì)的,我將下一專題和大家分享下我理解的泛型到底是怎樣的。

附件:http://down.51cto.com/data/2361673

網(wǎng)頁(yè)名稱:[C#基礎(chǔ)知識(shí)梳理系列]專題五:當(dāng)點(diǎn)擊按鈕時(shí)觸發(fā)Click事件背后發(fā)生的事情
本文地址:http://weahome.cn/article/ggeioo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部