【问题标题】:Compiler complains when Event has add & remove properties. Compiles OK without当 Event 具有添加和删除属性时,编译器会抱怨。编译OK
【发布时间】:2012-05-15 03:02:35
【问题描述】:

我在 this SO answer 之后对我的 C# 4.0 事件处理程序逻辑进行建模并得到错误

ThresholdExceededEvent 只能出现在 += 或 -= 的左侧

代码

    private EventHandler<EventLogAlert> thresholdExceededEventDelegate;
    public event EventHandler<EventLogAlert> ThresholdExceededEvent
    {
        add { thresholdExceededEventDelegate += value; Console.WriteLine("add operation"); }
        remove { thresholdExceededEventDelegate -= value; Console.WriteLine("remove operation"); }
    }

    protected virtual void OnThresholdExceededEvent(EventLogAlert e)
    {
        EventHandler<EventLogAlert> handler = ThresholdExceededEvent;
        if (handler != null)
        {
            handler(this, e);
        }
    }

但是当我这样做时它会编译......

   public event EventHandler<EventLogAlert> ThresholdExceededEvent;
    protected virtual void OnThresholdExceededEvent(EventLogAlert e)
    {
        EventHandler<EventLogAlert> handler = ThresholdExceededEvent;
        if (handler != null)
        {
            handler(this, e);
        }
    }

首选的方法是什么?

【问题讨论】:

  • 您可以直接访问委托而不是事件,例如"handler = thresholdExceededEventDelegate;"
  • 可以做到,但我想这样做是为了让它更多thread safe

标签: c# c#-4.0 properties delegates event-handling


【解决方案1】:

代替

EventHandler<EventLogAlert> handler = ThresholdExceededEvent;

使用

EventHandler<EventLogAlert> handler = thresholdExceededEventDelegate;

【讨论】:

    【解决方案2】:

    使用第二种方法;如果您不需要自定义处理附加到事件和从事件分离(并且您没有尝试显式地实现interface's 事件),那么就不需要第一个选项的更冗长的语法;无论如何,第二个中的代码将编译成与第二个选项非常相似的东西。

    您的第一个代码块中的语法错误是您试图直接执行显式实现的事件。在这种情况下,您需要执行委托本身而不是事件。

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多