使用类似动作或 Func 的事件 - 不好的做法

本文关键字:事件 Func | 更新日期: 2024-10-25 01:26:58

我检测到 C# 的特性,即可以使用 Action 或 Func 作为事件。我的意思是,我可以执行以下操作:

Action aAction;
aAction = DoSomething;
aAction += DoAnotherting;
// execute the action -> both functions will be executed
aAction();
aAction -= DoSomething;  // unsubscribe on function

我不知道这一点,认为使用 += 仅适用于事件。首先,这看起来很好,因为我不必使用 event 关键字,而且我也可以从 owner 类外部调用此操作(事件不可能)。但我想知道,这种用途是否有任何好的例子,或者这只是不好的做法?

这里显示了一个完整的示例:

[TestMethod]
public void DummyTest()
{
    DummyClass myInstance = new DummyClass();
    int i = 0;
    Action action1 = () => i++;
    Action action2 = () => i += 2;
    Func<int> func1 = () => 5;
    myInstance.MyFunc += () => 3;
    myInstance.MyFunc += func1;
    Assert.AreEqual(5, myInstance.MyFunc?.Invoke() );
    myInstance.MyFunc -= func1;
    Assert.AreEqual(3, myInstance.MyFunc?.Invoke() );
    myInstance.MyAction = action1;
    myInstance.MyAction += action2;
    myInstance.MyAction?.Invoke();
    Assert.AreEqual(3, i);
    myInstance.MyAction -= action1;
    myInstance.MyAction?.Invoke();
    Assert.AreEqual(5, i);
    myInstance.MyAction = () => i = 0;
    myInstance.MyAction?.Invoke();
    Assert.AreEqual(0, i);
}

class DummyClass
{
    public Action MyAction;
    public Func<int> MyFunc;
}

使用类似动作或 Func 的事件 - 不好的做法

我的印象是,event s 的全部意义在于将事件的控制放入封闭类型中。客户端无法选择何时触发事件。事件是一个(集合)函数,当某个类型的某些状态发生更改或客户端可能想要做出反应的有趣事情发生时,将调用该函数(/are),但确切的详细信息应保持隐藏,原因与不应向客户端公开字段的原因相同。

从某种意义上说,它本身并没有什么可怕的,因为它会炸毁你的房子,但另一方面,没有理由像这样使用它们。事件在语言中是有原因的,它们具有语义意义。如果你使用Action/Func委托而不是事件,阅读你的代码的人将不得不弄清楚你在做什么,以及为什么你不使用传统工具。这只是杂乱/噪音,所以我的建议是避免它。