C# 中的事件与无事件操作?

Event vs no Event Action in C#?

总的来说,我想知道,action后面的event关键字有什么作用,它和没有event的action有什么区别,增加了什么特性?

提示:请这样回答这个问题,因为我没有找到确切的答案。

public event Action action; // event action

public Action action; // action

当您声明 public Action action; 时,您有一个 public 委托。它可以在任何地方重新分配,这可能很危险。当您声明 public event Action action; 时,您有一个带有隐藏委托字段的 class,而 class 仅公开委托的某些功能;特别是,您只能使用 +=-= 附加和分离方法,但不能使用 = 完全重新分配。澄清这意味着什么:假设您有以下代码:

using System;

class Worker
{ 
  public Action action;

  public void DoWork() {
    action();
  }
}

static class Test
{  
  public static void Foo() {
    Console.WriteLine("Foo!");
  }

  public static void Main() {
    Worker w = new Worker();
    w.action = Foo;
    w.DoWork();
  }
}

class Worker 有一个名为 action 的 public 代表。在 Main 中,我们创建一个新实例 w 并使其 action 指向方法 Foo。稍后我们可以通过类似 w.action = Bar 的方式重新分配它。这可能被视为危险。

如果 class Worker 的字段 action 被定义为 event,即 public event Action action; 则直接赋值,例如 w.action = Foo 将是非法的。相反,我们可以使用 += 附加 一个特定的处理程序到事件。然后以下工作:

using System;

class Worker
{ 
  public event Action action;

  public void DoWork() {
    action();
  }
}

static class Test
{  
  public static void Foo() {
    Console.WriteLine("Foo!");
  }

  public static void Main() {
    Worker w = new Worker();
    w.action += Foo;
    w.DoWork();
  }
}