场景

委托(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 = ;
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();
Console.WriteLine("Value of Num: {0}", getNum());
nc2();
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;
}

最新文章

  1. it市场
  2. Co-saliency-Huazhu Fu
  3. javax.servlet.ServletException cannot be resolved to a type错误解决方法
  4. SSH+DWZ、JQuery-UI ,swfobject.embedSWF属性与用法,IE下日期控件被flash控件挡住
  5. 《javascript高级程序设计》第七章 递归recursion
  6. 《C++ Primer》之重载操作符与转换(下)
  7. HDU 5692 (DFS序+线段树)
  8. CentOS 访问 Windows 共享目录
  9. BZOJ 2806: [Ctsc2012]Cheat [广义后缀自动机 单调队列优化DP 二分]
  10. 「LibreOJ NOIP Round #1」旅游路线
  11. 第 10 章 容器监控 - 080 - Weave Scope 容器地图
  12. Mybatis教程-实战看这一篇就够了
  13. 使用dstat命令的插件查看mysql的io状态
  14. xtrabackup全库还原+binlog日志还原
  15. META-INF下文件读取
  16. python第二十九课——文件读写(读取读取中文字符)
  17. hdu1584
  18. Parallelism VS Concurrency
  19. tab标签 插件 by 腾讯 jianminlu
  20. 洛谷P1024 一元三次方程求解(数学)

热门文章

  1. Go-项目结构和代码组织
  2. 整合-flowable-modeler,第一篇
  3. Java网络编程与NIO详解2:JAVA NIO 一步步构建I/O多路复用的请求模型
  4. wordcloud库基本介绍和使用方法
  5. Appium+python自动化(三十五)- 命令启动appium之 appium服务命令行参数(超详解)
  6. 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(1)
  7. Linux Web集群架构详细(亲测可用!!!)
  8. python 29 Socket - 套接字
  9. 设计模式(C#)——03建造者模式
  10. ConcurrentLinkedQueue 源码解读