欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#中委托和事件的区别实例解析

程序员文章站 2023-12-20 13:19:58
本文实例分析了c#中委托和事件的区别,分享给大家供大家参考之用。具体如下: 大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量...

本文实例分析了c#中委托和事件的区别,分享给大家供大家参考之用。具体如下:

大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。本篇分别通过委托和事件执行多个方法,从中体会两者的区别。

一、通过委托执行方法

class program
{
    static void main(string[] args)
    {
      example example = new example();
      example.go();
      console.readkey();
    }
}
public class example
{
    public delegate void dosth(string str);
    internal void go()
    {
      //声明一个委托变量,并把已知方法作为其构造函数的参数
      dosth d = new dosth(print);
      string str = "hello,world";
      //通过委托的静态方法invoke触发委托
      d.invoke(str);
    }
    void print(string str)
    {
      console.writeline(str);
    }
}

上述代码实现:

① 在clr运行时,委托dosth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个invoke实例方法,用来触发委托的执行。
② 委托dosth定义了方法的参数和返回类型
③ 通过委托dosth的构造函数,可以把符合定义的方法赋值给委托
④ 调用委托的实例方法invoke执行了方法

但实际上让委托执行方法还有另外一种方式,那就是:委托变量(参数列表)

public class example
{
    public delegate void dosth(object sender, eventargs e);
    internal void go()
    {
      //声明一个委托变量,并把已知方法作为其构造函数的参数
      dosth d = new dosth(print);
      object sender = 10;
      eventargs e = new eventargs();
      d(sender, e);
    }
    void print(object sender, eventargs e)
    {
      console.writeline(sender);
    }
}

上述代码实现:

① 委托dosth的参数列表和方法print的参数列表还是保持一致
② 委托dosth中的参数object sender通常用来表示动作的发起者,eventargs e用来表示动作所带的参数。

而实际上,委托变量(参数列表),事件就是采用这种形式执行方法的。

二、通过事件执行方法

public class example
{
    public delegate void dosth(object sender, eventargs e);
    public event dosth mydosth;
    internal void go()
    {
      //声明一个委托变量,并把已知方法作为其构造函数的参数
      dosth d = new dosth(print);
      object sender = 10;
      eventargs e = new eventargs();
      mydosth += new dosth(d);
      mydosth(sender, e);
    }
    void print(object sender, eventargs e)
    {
      console.writeline(sender);
    }
}

上述代码实现:

① 声明了事件mydosth,事件的类型是dosth这个委托
② 通过+=为事件注册委托
③ 通过dosth委托的构造函数为事件注册委托实例
④ 采用委托变量(参数列表)这种形式,让事件执行方法

而且,通过+=还可以为事件注册多个委托。

public class example
{
    public delegate void dosth(object sender, eventargs e);
    public event dosth mydosth;
    internal void go()
    {
      //声明一个委托变量,并把已知方法作为其构造函数的参数
      dosth d = new dosth(print);
      dosth d1 = new dosth(say);
      object sender = 10;
      eventargs e = new eventargs();
      //为事件注册多个委托
      mydosth += new dosth(d);
      mydosth += new dosth(d1);
      mydosth(sender, e);
    }
    void print(object sender, eventargs e)
    {
      console.writeline(sender);
    }
    void say(object sender, eventargs e)
    {
      console.writeline(sender);
    }
}

以上,通过+=为事件注册1个或多个委托实例,实际上,还可以为事件直接注册方法。

public class example
{
    public delegate void dosth(object sender, eventargs e);
    public event dosth mydosth;
    internal void go()
    {
      object sender = 10;
      eventargs e = new eventargs();
      //为事件注册多个委托
      mydosth += print;
      mydosth += say;
      mydosth(sender, e);
    }
    void print(object sender, eventargs e)
    {
      console.writeline(sender);
    }
    void say(object sender, eventargs e)
    {
      console.writeline(sender);
    }
}  
 

三、通过eventhandler执行方法

先来看eventhandler的源代码。

public delegate void eventhandler(object sender, system.eventargs e);

可见,eventhandler就是委托。现在就使用eventhandler来执行多个方法。

public class example
{
    public event eventhandler myevent;
    internal void go()
    {
      object sender = 10;
      eventargs e = new eventargs();
      //为事件注册多个委托
      myevent += print;
      myevent += say;
      myevent(sender, e);
    }
    void print(object sender, eventargs e)
    {
      console.writeline(sender);
    }
    void say(object sender, eventargs e)
    {
      console.writeline(sender);
    }
}

总结:

① 委托就是一个类,也可以实例化,通过委托的构造函数来把方法赋值给委托实例
② 触发委托有2种方式: 委托实例.invoke(参数列表),委托实例(参数列表)
③ 事件可以看作是一个委托类型的变量
④ 通过+=为事件注册多个委托实例或多个方法
⑤ 通过-=为事件注销多个委托实例或多个方法
⑥ eventhandler就是一个委托

相信本文所述对大家c#程序设计的学习有一定的借鉴价值。

上一篇:

下一篇: