C#中Action和event有什么区别?

3
阅读一些代码时,我注意到一些类具有操作,但只有其中一些也是事件:
public Action OnAction1;

public event Action OnAction2;

有什么区别吗?


1
你在询问字段和事件之间的区别。 - Camilo Terevinto
1
请解释一下,事件不是字段吗? - Moffen
2
你会想从这里开始:https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/events/ - Camilo Terevinto
1
@Moffen:粗略地说,事件(Events)的工作方式类似于属性(Properties),其类型必须是委托,并且只有公共的添加/移除访问器。每个事件都使其与普通字段(Fields)有所不同。虽然没有完全与字段相对应的东西,但事件与之相差甚远。 - Christopher
1个回答

11

这实际上相当于字段和属性之间的区别,它增加了一个间接层,使您可以安全地添加或删除订阅者,而不会像属性一样暴露底层字段,从而保护对字段值的访问。

public Action OnAction1; // field
public Action OnAction2 { get; set; } // property
public event Action OnAction3; // event

与属性一样,事件也可以“自动实现”,这意味着会为您生成一个基础后备字段。
与属性一样,事件可以具有显式的Getter和Setter:
private Action onAction2;
public Action OnAction2
{
    get
    {
        return onAction2;
    }
    set
    {
        onAction2 = value;
    }
}

事件可以具有显式的添加和删除处理程序:

private Action onAction3;
public event Action OnAction3
{
    add
    {
        onAction3 += value;
    }
    remove
    {
        onAction3 -= value;
    }
}

外部类没有办法通过OnAction3事件直接访问底层的onAction3字段,就像你不能直接通过OnAction2属性访问onAction2字段一样。

当然,通过明确实现这些访问器,你还可以执行其他操作,如值验证或转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接