場景 委托(Delegate) 委托是對存有某個方法的引用的一種引用類型變數。 委托特別用於實現事件和回調方法。 聲明委托 實例化委托 聲明瞭委托類型,委托對象必須使用new關鍵字來創建,且與一個特定的方法相關。 當創建委托時,傳遞到 new 語句的參數就像方法調用一樣書寫,但是不帶有參數。例如: ...
場景
委托(Delegate)
委托是對存有某個方法的引用的一種引用類型變數。
委托特別用於實現事件和回調方法。
聲明委托
public delegate int MyDelegate (string s);
實例化委托
聲明瞭委托類型,委托對象必須使用new關鍵字來創建,且與一個特定的方法相關。
當創建委托時,傳遞到 new 語句的參數就像方法調用一樣書寫,但是不帶有參數。例如:
public delegate void printString(string s); ... printString ps1 = new printString(WriteToScreen);
示例代碼
using System; delegate int NumberChanger(int n); namespace DelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { // 創建委托實例 NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); // 使用委托對象調用方法 nc1(25); Console.WriteLine("Value of Num: {0}", getNum()); nc2(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
事件
事件在類中聲明且生成,且通過使用同一個類或其他類中的委托與事件處理程式關聯。包含事件的類用於發佈事件。這被稱為 發佈器(publisher) 類。其他接受該事件的類被稱為 訂閱器(subscriber) 類。事件使用 發佈-訂閱(publisher-subscriber) 模型。
發佈器(publisher) 是一個包含事件和委托定義的對象。事件和委托之間的聯繫也定義在這個對象中。發佈器(publisher)類的對象調用這個事件,並通知其他的對象。
訂閱器(subscriber) 是一個接受事件並提供事件處理程式的對象。在發佈器(publisher)類中的委托調用訂閱器(subscriber)類中的方法(事件處理程式)。
聲明事件
在類的內部聲明事件嗎,首先必須先聲明該事件的委托類型。
public delegate void BoilerLogHandler(string status);
然後聲明事件本身。
public event BoilerLogHandler BoilerEventLog;
跨窗體傳值示例
效果
實現
首先在彈窗的窗體CurveCompare中聲明委托
public delegate void ChangeTextDelegete(string s);
然後基於此委托定義事件
public static event ChangeTextDelegete changeBoxTextEvent;
然後是按鈕的具體的點擊事件中的處理
private void button1_Click(object sender, EventArgs e) { string aa = "hello"; if(changeBoxTextEvent != null){ changeBoxTextEvent(aa); } }
完整彈窗窗體代碼
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ZedGraphTest { public partial class CurveCompare : Form { //委托的定義 public delegate void ChangeTextDelegete(string s); //事件聲明 public static event ChangeTextDelegete changeBoxTextEvent; public CurveCompare() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string aa = "hello"; if(changeBoxTextEvent != null){ changeBoxTextEvent(aa); } } } }
然後再到要改變值的窗體中。
在其初始化方法中
CurveCompare.changeBoxTextEvent += new CurveCompare.ChangeTextDelegete(changeText);
然後編寫改變值的方法
public void changeText(string s) { this.textBox1.Text = s; }
Form1完整示例代碼
public partial class Form1 : Form { public Form1() { InitializeComponent(); CurveCompare.changeBoxTextEvent += new CurveCompare.ChangeTextDelegete(changeText); } public void changeText(string s) { this.textBox1.Text = s; }