<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # [C# 基礎知識系列]專題五:當點擊按鈕時觸發Click事件背后發生的事情 **引言:** 當我們在點擊窗口中的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方法里面設置斷點看看代碼是如何執行的(通過查看調用堆棧來看看代碼的執行順序),下面是我設置斷點的一張調用堆棧截圖: ![](https://box.kancloud.cn/2016-01-23_56a2eb2985144.png) 從上圖中我發現在調用button1_Click方法之前要執行**Control.OnClick(System.EventArgs e)**方法的,然后我們用發射工具去查看下**Control.OnClick(System.Eventrgs e)**方法中具體有什么樣的代碼:OnClick方法內部代碼截圖為: ![](https://box.kancloud.cn/2016-01-23_56a2eb299e5ff.png) 從反射的代碼中可以明白,首先從**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事件的代碼截圖:**** ![](https://box.kancloud.cn/2016-01-23_56a2eb29bc789.png) **二、小結** 本專題首先提出我對按鈕單擊事件背后發生的事情的疑惑,通過調試和反射工具一步一步把疑惑接觸,相信其他控件的其他事件也是如此的,本專題主要想讓大家知道下.Net類庫為我們做的事情的,希望一些初學者們了解知識時,要努力知道事物的本質。最后希望本專題可以讓大家更進一步的理解事件的本質的,我將下一專題和大家分享下我理解的泛型到底是怎樣的。 反射工具的下載地址:[http://files.cnblogs.com/zhili/Reflector.zip](http://files.cnblogs.com/zhili/Reflector.zip)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看