C sharp #006# 委託與事件

飲水思源:金老師的自學網站編程

委託(Delegate)

「不學會委託(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. 如有返回值,則委託變量的返回值是最後調用方法的返回值
        }
    }
}

 

Click事件探究

.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;
        }
    }
}
相關文章
相關標籤/搜索