简化事件和委托

来源:互联网 发布:网络还原精灵 编辑:程序博客网 时间:2024/06/04 19:45

完整的文章和代码下载:http://www.dingos.cn/index.php?topic=766.0

内容

  • 介绍
  • 什么是委托?
  • 理解事件
  • event关键字
  • 结束语


介绍

    当我在学习事件和委托时,我看了许多文章才能明白他们是什么和如何使用他们,现在我想在这里将我学习的东西以及你需要学习的内容呈现在这里。

什么是委托?
    委托和事件的概念是绑在一起的。委托可以认为是函数指针,也就是说,委托执行函数。
    Delegate是一个类。当创建委托实例时,可以通过函数名(如构造委托的参数),委托执行这个函数。
    每个委托都有一个签名。例如:

  1. Delegate int SomeDelegate(string s, bool b);
  2. //是委托的声明。当看到这个委托前面时,也就说委托具有返回一个整型数据和具有两个参数(string和bool)。

    可以说当创建委托实例时,可以通过函数名作为创建委托的参数。值得注意的是作为同一个委托的函数有相同的函数签名,可以作为委托的参数。

考虑下面的函数:

  1. private int SomeFunction(string str, bool bln){...}

    可以通过SomeDelegate构造器来调用这个方法,因为他们具有相同的签名。

  1. SomeDelegate sd = new SomeDelegate(SomeFunction);

    现在sd指向SomeFunction,换句话说,SomeFunction注册了sd。如果想调用sd,SomeFunction将被调用。记住所说的注册函数。接下来处理注册的函数。

  1. sd("somestring"true);

    现在应该知道如何使用委托,开始理解事件......

理解事件

  • Button是一个类,当点击它的时候将会产生click事件。
  • Time是一个类,每毫秒产生tick事件。


    想知道这是如何产生的吗?通过下面的例子来学习:

    这个方案:有一个名为Counter的类。类中包含名为CountTo(int countTo, int reachableNum)的方法开始从0统计到countTo,当达到reachableNum是将触发名为NumberReached的事件。

......

event关键字
    许多人可能会问这样的问题:“如果没有event关键字将发生什么?”

    本质上,声明event关键字是防止其他的用户的委托设置为null。这为什么这么重要?想象一下作为客户端添加委托将回调类方法列表。因此有其他客户端。这样做是好的。现在想象可以使用“+=”将代替新的“=”来设置回调方法列表。所有其他客户将不会收到他们的回调函数。在这种情形下使用event关键字解决目标。如果在Counter类中移除event关键字在应用程序中编译将会出现编译错误:

结束语
    ...............

完整的文章和代码下载:http://www.dingos.cn/index.php?topic=766.0

原创粉丝点击