c# - System.Action<T> 作为 EventHandler

标签 c# .net action event-handling func

<分区>

反对使用委托(delegate) System.ActionSystem.Func 作为 EventDelegates 而不是经典的 EventHandler 模式的内容。我会因此遇到问题吗?

private bool disposed;

public event Action<IUnitOfWork, IContext> Disposing;

public void Dispose()
{
    if (this.disposed)
    {
        return;
    }

    if (null != this.Disposing)
    {
        this.Disposing(this, this.AttachedContext);
    }

    this.disposed = true;
}

用法:

unitOfWorkInstance.Disposing += (u, c) => c.Rollback(u); // in my opinion more readable than
unitOfWorkInstance.Disposing += (sender, args) => args.AttachedContext.Rollback(sender as IUnitOfWork);

最佳答案

好吧,您提供的代码不是线程安全的 - 有人可能会在您的无效测试之后和您调用 this.Disposing 之前取消订阅事件处理程序。

但总的来说,它应该可以正常工作。不利之处在于,如果不遵循 EventHandler 约定,您在可以订阅的内容方面会稍微受到一些限制。

例如,假设您有一个非常通用的事件处理程序方法:

public void LogEvent(object sender, EventArgs e)
{
    Console.WriteLine("Event raised");
}

您可以使用它来订阅遵循正常约定的任何事件 - 但不是 你的事件。

不过这是一个非常小的缺点。我想一个可能更大的问题是,它可能会让其他期望看到传统事件签名的开发人员感到困惑。

编辑:我只记得其他一些库可能需要传统的事件签名——例如,Reactive Extensions。 IIRC,订阅其他事件也不是不可以,只是难了点。

关于c# - System.Action<T> 作为 EventHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6108037/

相关文章:

c# - 数据网格列绑定(bind)

c# - 在运行时更新 app.config system.net 设置

iphone - 什么时候按钮(UIButton)的目标不是 "self"?

web-services - 使用 CXF 在 WSDL 中的soapaction

c# - 如何测试串行/ super 终端与 C# 的集成?

javascript - 在 JS 中设置值,但代码隐藏没有获得更新的值。 ASP网

Javascript 哈希原型(prototype)到 C#

c# - 如何更改进程或线程的 DateTime.UtcNow 值?

c# - 如何以编程方式运行 NUnit

java - 将操作方法​​添加到动态创建的组合中