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();
}
}
总的来说,我想知道,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();
}
}