c# - 事件设计指南

标签 c# .net eventargs

<分区>

我尽量坚持 Framework Design Guidelines即使在设计仅供内部使用的类库时也是如此。

在某种程度上,它让我的生活更轻松,因为我使用代码分析来自动检查我可能没有使用最佳实践的地方。

但在这种情况下,我不得不忽略这些建议。

由于 EventArgs 约束已从 .NET 4 中的 EventHandler 中删除,为什么现在有人想要使用从 EventArgs 派生的类(如 https://msdn.microsoft.com/en-us/library/ms229011(v=vs.110).aspx 中规定)而不是直接使用所需的数据类型并避免分配成本另一个对象并在其中嵌入所需的数据?

例如,必须编写以下内容:

public class ExceptionEventArgs : EventArgs
{
    private readonly Exception _exception;

    public ExceptionEventArgs(Exception exception)
    {
        _exception = exception;
    }

    public Exception Exception
    {
        get
        {
            return _exception;
        }
    }
}

public event EventHandler<ExceptionEventArgs>;

更加冗长,因为需要额外分配而不是:

public event EventHandler<Exception>;

几周前我什至创建了一个通用的 EventArgs 用于另一个类,但我觉得这样做很愚蠢只是为了遵守指南。

public class EventArgs<T> : EventArgs
{
    private readonly T _data;

    public EventArgs(T data)
    {
        _data = data;
    }

    public T Data
    {
        get
        {
            return _data;
        }
    }
}

那么,使用

有什么缺点吗?
EventHandler<NotAnEventArgsDerivedClass>

仅供内部*使用的类?

*我的意思是,用于由多个组件组成的产品 - 所有组件均专供产品本身使用。

最佳答案

最好继承EventArgs。使用没有缺点

EventHandler<NotAnEventArgsDerivedClass>

但它仍然假设您希望将 sender 作为 object 传递,而传递 sender 可能有意义也可能没有意义根本。

EventArgs 的使用是我能想到的唯一一种情况,因为当我们实际上并不需要我们从中继承的类时,通常会根据约定从类继承。 类似地,标准 Handler(object sender, EventArgs e) 委托(delegate)是我所知道的唯一一种常见的情况,它通常基于约定而不是该特定方法的要求来设计方法签名。它鼓励我们在传递 sender 可能有意义或根本没有意义时传递无类型参数。它导致我们忽略参数的方法,不信任参数的值,并将对象转换为更具体的类型,因为我们“只知道”它们到底是什么。

与任何其他设计一样,我们应该创建所需的方法并传递所需的参数。可能存在约定有用的情况,但这不是其中之一。

关于c# - 事件设计指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36509423/

相关文章:

C# 自定义 EventArgs 问题

c# - 为什么使用 EventArgs.Empty 而不是 null?

c# - 单元测试 WPF 中的 ResourceDictionay

c# - Json.net 属性 : single value or array of values

c# - 如何将多个程序集合并为一个程序集?

c# - 在 .NET 中重新加载程序集而不创建新的 AppDomain

c# - 静态属性/ViewModel(C#、WinRT)

c# - ILMerge问题

.net - 温莎城堡 : So what DOES ActAs do?

c# - += delegate {} 是将自定义 eventargs 附加到 UI 控件事件的正确方法吗?