• 《Inside C#》笔记(十二) 委托与事件


    C#的委托与C++的函数指针类似,但委托是类型安全的,意味着指针始终会指向有效的函数。委托的使用主要有两种:回调和事件。

     

    一 将委托作为回调函数

    在需要给一个函数传递一个函数指针,随后通过函数指针调用函数时,就可以使用回调函数的方式。回调函数经常用于异步编程,如果被调用的方法执行起来比较费时,就可以把这个方法放在单独在线程执行,同时将函数指针交给回调函数,线程结束时再调用回调函数。这样调用者就不必因等待执行起来费时的方法而被阻塞了。

     

    a) 举例,有一个数据库管理类DBManager,这个类追踪所有激活的数据库连接DBConnection,并通过EnumConnections()方法可以遍历输出这些连接。假设DBManager运行在远程服务器上,那么最好异步执行EnumConnections方法,并使用回调函数接收结果。

    DBConnection类如下:

    DBManager类如下:

     

    这里声明了委托EnumConnectionsCallback,方法签名为无返回值、有一个DBConnection参数,在调用EnumConnections方法时,传递EnumConnectionsCallback类型的函数指针。

    然后调用代码写法如下:

    函数指针指向了ActiveConnectionsCallBack方法,这个方法与定义的委托具有相同的签名。

     

    b) 每次调用EnumConnections方法时都需要实例化EnumConnectionsCallback,这样使用起来很不方便,那么就可以将myCallBack修饰为静态的,方便每次直接使用。

     

    c) 关于回调函数的命名规范,通用的做法是以Callback结尾,但有时委托本身往往也经常以Callback结尾,这时需要注意区分二者,因为回调函数属于方法,而委托属于类,如果二者混淆,会导致编译错误。

     

    d) 委托的初始化往往比较耗费时间和资源,而且并不能保证初始化后一定会被用到,于是可以延迟其初始化,只有在开始使用前,才进行初始化,使用只读属性可以实现这个思路

     

    e) 如果需要同时使用多个委托,该如何做呢,比如有一个库存管理类一旦商品数量低于警戒值,一方面会记录日志,另一方面会发邮件给相关人员。主要改变的地方在初始化委托,将两个委托加起来赋值给callback。

     

    而且两个回调执行的顺序是按照相加的顺序的。还可以使用减号解除某个回调。

     

    f) Windows系统有许多场合用到了事件,如消息队列、用户交互等。C#中的事件遵循发布-订阅(观察者)模式,一个消息源可以被多个对象订阅。事件是特殊的委托,这种委托必须有两个参数,第一个参数为发布者或者说事件的触发者,第二个参数为派生自EventArgs的对象。

     

    学习资料:Inside C# by Tom Archer

  • 相关阅读:
    IOS – OpenGL ES 设置图像锐化 GPUImageSharpenFilter
    IOS – OpenGL ES 设置图像滤镜 GPUImageSoftEleganceFilter
    IOS – OpenGL ES 设置图像模糊 GPUImageFastBlurFilter
    IOS – OpenGL ES 桑原滤波/水粉画模糊效果 GPUImageKuwaharaFilter
    IOS – OpenGL ES 黑白马赛克效果 GPUImageMosaicFilter
    IOS – OpenGL ES 绘制线条 GPUImageLineGenerator
    IOS – OpenGL ES 设置图像反遮罩锐化 GPUImageUnsharpMaskFilter
    IOS – OpenGL ES 设置图像黑白噪点 GPUImageLocalBinaryPatternFilter
    git简单使用
    nuxt简单使用
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/7143729.html
Copyright © 2020-2023  润新知