栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

C#事件如何在后台工作?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#事件如何在后台工作?

我已经在文章中详细介绍了这一点,但是这里是总结,假设您对委托人自己很满意:

  • 事件实际上是“添加”方法和“删除”方法,就像属性实际上只是“获取”方法和“设置”方法一样。(实际上,CLI也允许使用“ raise / fire”方法,但是C#从未生成此方法。)元数据通过引用方法来描述事件。
  • 当您声明类似 字段的事件 (例如ElementAddedEvent)时,编译器将生成方法 和私有字段 (与委托的类型相同)。在类中,当您引用ElementAddedEvent时,您是在引用字段。在课堂之外,您指的是领域。
  • 任何人订阅使用add方法的事件(使用+ =运算符)时。当他们退订(使用-=运算符)时,将调用remove。
  • 对于类似字段的事件,需要进行一些同步,否则添加/删除仅调用Delegate。合并 / 删除以更改自动生成的字段的值。这两个操作都分配给后备字段-请记住,委托是不可变的。换句话说,自动生成的代码非常像这样:

    // Backing field

    // The underscores just make it simpler to see what’s going on here.
    // In the rest of your source pre for this class, if you refer to
    // ElementAddedEvent, you’re really referring to this field.
    private EventHandler __ElementAddedEvent;

    // Actual event
    public EventHandler ElementAddedEvent
    {
    add
    {
    lock(this)
    {
    // Equivalent to __ElementAddedEvent += value;
    __ElementAddedEvent = Delegate.Combine(__ElementAddedEvent, value);
    }
    }
    remove
    {
    lock(this)
    {
    // Equivalent to __ElementAddedEvent -= value;
    __ElementAddedEvent = Delegate.Remove(__ElementAddedEvent, value);
    }
    }
    }

  • 在您的情况下,所生成字段的初始值为

    null
    -,并且
    null
    如果所有订阅者都被删除,它将始终再次变为初始值,这就是Delegate.Remove的行为。

  • 如果您希望“无操作”处理程序订阅您的事件,以避免无效检查,则可以执行以下操作:

    public EventHandler<EventArgs> ElementAddedEvent = delegate {};

delegate {}
只是它不关心它的参数,所以没有任何一个匿名方法。

如果还有什么不清楚的地方,请询问,我将尽力帮助!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/573234.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号