飲水思源:金老師的自學網站編程
「不學會委託(Delegate),等於沒學.NET編程!」網站
例程1-委託類型變量this
using System; namespace ConsoleApp1 { class Program { // 1. 定義一個委託類型 public delegate int MathOptDelegate(int value1, int value2); public static int add(int a, int b) { return a + b; } static void Main(string[] args) { // 2. 委託類型變量能夠接收一個方法引用(實例方法、靜態方法均可以) MathOptDelegate mathOpt = Program.add; Console.WriteLine(mathOpt(1, 2)); // => 3 Console.ReadKey(); } } }
/spa
例程2-以委託變量做爲參數的方法code
using System; namespace ConsoleApp1 { class Program { // 1. 定義一個委託類型 public delegate void doSomething(); // 2. 定義一個以委託類型變量做爲參數的方法 public static void sampleMethod(doSomething doSomething) { Console.WriteLine("begin to do something."); doSomething(); Console.WriteLine("stop doing something."); } // 3. 定義一個與委託類型匹配的方法 public static void sayHello() { Console.WriteLine("hello"); } static void Main(string[] args) { sampleMethod(sayHello); Console.ReadKey(); // => begin to do something. // => hello // => stop doing something. } } }
/orm
例程3-委託調用列表(多路委託)對象
using System; namespace ConsoleApp1 { class Program { // 1. 定義一個委託類型 public delegate void doSomething(); // 2. 定義2個與委託類型匹配的方法 static void SayHello() => Console.WriteLine("hello"); static void SayGoodbye() => Console.WriteLine("Goodbye"); static void Main(string[] args) { doSomething doSomething = SayHello; doSomething += SayGoodbye; doSomething(); // => hello // => Goodbye Console.WriteLine(doSomething.GetInvocationList().Length); // => 2 doSomething -= SayHello; doSomething -= SayHello; doSomething -= SayHello; doSomething(); // => Goodbye Console.ReadKey(); // PS. 如有返回值,則委託變量的返回值是最後調用方法的返回值 } } }
.NET的事件響應機制也是用委託來實現的,以實現Click事件爲例,大概分爲以下幾個步驟↓blog
一、定義一個委託類型(該類型被定義在System命名空間中)索引
public delegate void EventHandler(object sender, EventArgs e);
二、聲明一個委託類型變量(該變量被定義在相應組件中)事件
public event EventHandler Click;
加event和不加event的區別在於,加了event,事件只能由事件源對象激發,外界沒法經過訪問該變量激發。
三、掛載事件
this.button2.Click += new System.EventHandler(this.button2_Click);
button2_Click知足EventHandler的規範,該方法在適當的時候會被調用:
private void button2_Click(object sender, EventArgs e) { }
/
例程-動態掛載響應方法
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void resp1(object sender, EventArgs e) { MessageBox.Show("響應1"); } private void resp2(object sender, EventArgs e) { MessageBox.Show("響應2"); } private void button1_Click(object sender, EventArgs e) { button3.Click -= resp2; button3.Click -= resp1; // 防止累加 button3.Click += resp1; // 上面爲簡單寫法, // 等價寫法:button3.Click += new EventHandler(resp1); } private void button2_Click(object sender, EventArgs e) { button3.Click -= resp1; button3.Click -= resp2; // 防止累加 button3.Click += resp2; } } }