沿“委托”而上溯到“NET事件模型”-来自王涛《你必须知道的.NET》

本文介绍了使用.NET框架实现事件模型的方法,详细解释了如何利用委托来创建和管理事件,包括定义事件、触发事件以及如何将不同的事件处理方法连接成委托链。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

委托链有一个特性: 就是所有加入的委托, 都会在激活时按照加入的次序被执行.

下面看用委托实现的NET事件模型

public class Calculator
{
    //定义计算器事件CalculateEventArgs
  public class CalculateEventArgs:EventArgs
  {
    //只读数据变量
    public readonly Int32 x, y;
    //构造函数-在这里输入数据变量
    public CalculateEventArgs(Int32 x,Int32 y)
    {
      this.x=x;
      this.y=y;
    }
  }

  //声明事件委托,名称为CalculateEventHandler
  //注意前面没有说,多播的委托多数需要返回值是void
  public delegate void CalculateEventHandler(object Sender, CalculateEventArgs e);

  //这是计算器类的事件字段,用于外部绑定
  public event CalculateEventHandler MyCalculate;

  //提供一个受保护的虚拟方法,子类可以覆盖它,以便·进行拒绝监视等操作
  protected virtual void OnCalculate(CalculateEventArgs e)//注意其参数的写法
  {
    if (MyCalculate!=null)
    {
      MyCalculate(this,e);//参数就是为了能正常调用委托类型变量的
    }
  }

  //进行计算-调用这个方法表示有新的计算发生了
  public void Calculate(Int32 x, Int32 y)
  {
    CalculateEventArgs e=new CalculateEventArgs(x,y);

    OnCalculate(e);//还记得委托链吗?能按次序通知所有事件的注册者
  }
}

//定义一个消息触发器-触发消息用的
public class CalculatorManager
{
  //消息通知方法1,定义跟Calculator.CalculateEventArgs一样
  public void Add(object Sender,Calculator.CalculateEventArgs e)
  {
    System.Windows.Forms.MessageBox.Show("加法结果:" + (e.x + e.y));
  }
  //消息通知方法2,定义跟Calculator.CalculateEventArgs一样
  public void Subtract(object Sender, Calculator.CalculateEventArgs e)
  {
    System.Windows.Forms.MessageBox.Show("减法结果:" + (e.x - e.y));
  }
}

...调用代码

private void button4_Click(object sender, EventArgs e)
{
  //定义计算器对象
  Calculator cal = new Calculator();
  //定义计算器事件触发器对象
  CalculatorManager cm = new CalculatorManager();

  //事件绑定
  cal.MyCalculate += cm.Add;//注意不能有括号
  cal.MyCalculate += cm.Subtract;

  //事件激活---------------------
  //先准备数据
  int x = Convert.ToInt32(textBox1.Text);
  int y = Convert.ToInt32(textBox2.Text);
  cal.Calculate(x,y);
  //-----------------------------
  //这其实也是用委托实现的观察者模式
  //cal.MyCalculate += cm.Add;-------->这里也就是在增加(或者叫注册)观察者
  //通过cal.Calculate(x,y);激活观察事件通知,由于委托链的特性,使得
  //在委托链之中的观察者(就是你绑定的事件cal.MyCalculate += cm.Subtract;)
  //都能得到通知
}


...

转载于:https://www.cnblogs.com/lizunicon/archive/2008/04/23/1167680.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值