標籤:style blog http io ar color os 使用 sp
委託(delegate)是一種可以把引用儲存為函數的類型。
委託的聲明類似於函數,但不帶函數體,且要使用delegate關鍵字,委託的聲明指定了一個傳回型別和一個參數列表。
在定義了委託之後,就可以聲明該委託的變數。接著把這個變數初始化未與委託有相同傳回型別和參數列表的函數引用。之後,就可以使用委託變數調用這個函數,就想該變數是一個函數一樣。
using System;namespace TestDelegate{ class Program { delegate double ProcessDelegate(double param1, double param2); static double Multiply(double param1, double param2) { return param1 * param2; } static double Divide(double param1, double param2) { return param1 / param2; } static void Main(string[] args) { ProcessDelegate process; double input1 = 10.0; double input2 = 2.0; string input = Console.ReadLine(); if (input == "*") { process = new ProcessDelegate(Multiply); } else { process = new ProcessDelegate(Divide); } Console.WriteLine("Result:{0}",process(input1,input2)); Console.ReadKey(); } }}
當執行個體化委託時,參數是函數名,而當使用的時候,把委託執行個體名稱作為函數名使用了,而此時規律是,委託類型和函數的傳回值和參數列表一致。
如果把函數的參數列表改一個,就出現編譯時間錯誤。
錯誤 1 “Multiply”的重載均與委託“TestDelegate.Program.ProcessDelegate”不匹配
使用委託的四部曲:
- 定義一種委託類型
- 委託執行時要調用方法
- 定義一個委託執行個體
- 委託執行個體的調用
我知道在.Net中事件都是通過委託來實現的,那我找個例子。.NET中經常使用的控制項Button,當我們把Button 控制項 drap and drop到介面,然後雙擊介面的Button我們發現程式中自動產生了一個響應Button的事件方法,然後我們給事件方法添加Code之後,當我們點擊該Button就響應該方法了,但我們沒有看到代碼中有任何的委託和事件之類的定義,其實這些.NET都已經做好了。我們可以查看如下檔案。
圖2事件委託實現
其中,EventHandler就是一個代理類型,可以認為它是一個“類”,是所有傳回型別為void,具備兩個參數分別是object sender和EventArgs e,第一個參數表示引發事件的控制項,或者說它表示點擊的那個按鈕。通過以下的代碼我們細細解析一下。
private void button1_Click(object sender, EventArgs e) { //擷取被點擊Button的執行個體 Button objBotton = sender as Button; if (objBotton != null) { objBotton.Text = "Hello you click me."; objBotton.AutoSize = true; } else { //Exception Handle. } }
惡補ASP.NET基礎【1】委託