成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

引言:

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

當我們在點擊窗口中的Button控件VS會幫我們自動生成一些代碼,我們只需要在Click方法中寫一些自己的代碼就可以實現觸發(fā)Click事件后我們Click方法中代碼就會執(zhí)行,然而我一直有一個疑問的——既然上一專題中說事件是一個多播委托,然而自動生成的代碼中只有事件的實例化,卻沒有看到事件的調用,那既然沒有事件調用的代碼,那封裝的Click為什么會執(zhí)行呢?

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

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

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

[C# 基礎知識梳理系列]專題五:當點擊按鈕時觸發(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 = "請點擊我";
   this.button1.UseVisualStyleBackColor = true;
   this.button1.Click += new System.EventHandler(this.button1_Click);
}// 后臺代碼
  private void button1_Click(object sender, EventArgs e)
        {

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

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

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

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

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

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

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

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

 

二、小結

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

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

當前題目:[C#基礎知識梳理系列]專題五:當點擊按鈕時觸發(fā)Click事件背后發(fā)生的事情
分享地址:http://jinyejixie.com/article0/ggeioo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序定制網站、面包屑導航、外貿建站、網站策劃、ChatGPT

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
灵寿县| 新安县| 庆云县| 延长县| 洪江市| 景泰县| 武乡县| 浏阳市| 福贡县| 福贡县| 丹巴县| 新泰市| 德安县| 涟水县| 涟水县| 景泰县| 洪江市| 土默特右旗| 云浮市| 山阴县| 阳山县| 深水埗区| 澎湖县| 封开县| 库车县| 徐闻县| 镇宁| 赞皇县| 长宁区| 祁阳县| 罗定市| 上林县| 平原县| 武义县| 靖江市| 尚义县| 讷河市| 平定县| 文安县| 甘孜| 开远市|