【问题标题】:C# Event SubscriptionC# 事件订阅
【发布时间】:2009-02-24 20:10:12
【问题描述】:

在C#中有什么好处

public class blah
{

       public event EventHandler Blahevent;

}

public class blah
{

      private event EventHandler blahevent;

      public event EventHandler Blahevent
      {
          add
              {
                  blahevent+=value;
              } 
              remove
              {
                  blahevent-=value
              }
      }

}

反之亦然。

第一个是否打开了 blahinstance.Blahevent = null 或 blahinstance.Blahevent(obj,even)

【问题讨论】:

  • 如果只是公开的,你能做 blahinstance.Blahevent = null 或 blahinstance.Blahevent(obj,even) 吗?

标签: c# events language-features


【解决方案1】:

除非您想做一些不同的事情,否则显式实现添加/删除方法没有任何好处。可能的原因:

  • 也许自己控制事件支持代码(例如,直接链接到其他事件,而不是通过毫无意义的级联)
  • 在添加或删除时执行其他操作
  • 更改添加或删除的安全要求
  • 公开底层委托

默认实现是维护一个私有隐藏委托字段,每次添加或删除委托时都会替换该字段。在大多数情况下,无需执行上述任何操作,但灵活性是存在的。

【讨论】:

    【解决方案2】:

    第二个选项可以精确控制订阅或取消订阅指定事件时发生的情况,如果除了添加或删除指针之外还需要运行特定逻辑。

    【讨论】:

      【解决方案3】:

      您可以使用私有字段上的 [field: NonSerialized()] 属性将委托从序列化中排除。

      【讨论】:

      • 我不明白?事件会被序列化吗?
      • 是的,订阅者会被序列化,这通常不是你想要的。例如,如果有一个订阅此事件的表单,您将收到一个错误,指出该表单未标记为可序列化。所以使用属性可以解决这个问题。
      【解决方案4】:

      您可以在后者上放置断点以进行调试。有时这可能真的很有用(尽管在调试后我将其切换回前者)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多