场景
委托(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; }