Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 活动设计指南_C#_.net_Eventargs - Fatal编程技术网

C# 活动设计指南

C# 活动设计指南,c#,.net,eventargs,C#,.net,Eventargs,即使在设计只供内部使用的类库时,我也会尽可能地坚持这个原则 在某种程度上,它使我的生活更容易,因为我使用代码分析来自动检查我可能没有使用最佳实践的地方 但在这个案例中,我觉得很有必要忽略这些建议 既然.NET 4中的EventHandler中删除了EventArgs约束,为什么现在会有人希望使用从EventArgs派生的类(如中所述),而不是直接使用所需的数据类型,从而避免分配另一个对象并将所需数据嵌入其中的成本 例如,必须编写以下内容: public class ExceptionEventA

即使在设计只供内部使用的类库时,我也会尽可能地坚持这个原则

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

但在这个案例中,我觉得很有必要忽略这些建议

既然.NET 4中的EventHandler中删除了EventArgs约束,为什么现在会有人希望使用从EventArgs派生的类(如中所述),而不是直接使用所需的数据类型,从而避免分配另一个对象并将所需数据嵌入其中的成本

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

public class ExceptionEventArgs : EventArgs
{
    private readonly Exception _exception;

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

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

public event EventHandler<ExceptionEventArgs>;
公共类例外事件args:EventArgs
{
私有只读异常\u异常;
公共例外例外例外(例外)
{
_例外=例外;
}
公共例外
{
得到
{
返回异常;
}
}
}
公共事件处理程序;
由于需要额外的分配而不是:

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;
        }
    }
}
公共类EventArgs:EventArgs
{
私有只读T_数据;
公共事件参数(T数据)
{
_数据=数据;
}
公共T数据
{
得到
{
返回数据;
}
}
}
那么,使用它有什么缺点吗

EventHandler<NotAnEventArgsDerivedClass>
EventHandler
对于仅供内部*使用的类

*我的意思是,用于由多个程序集组成的产品—所有这些程序集都只供产品本身使用。

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

EventHandler<NotAnEventArgsDerivedClass>
EventHandler
但它仍然假设您希望将
发送方
作为
对象
传递,而传递
发送方
可能有意义,也可能没有意义

使用
EventArgs
是我能想到的唯一一种情况,因为惯例,当我们实际上不需要从类继承时,从类继承是很常见的。 类似地,标准的
处理程序(objectsender,EventArgs e)
委托是我所知道的唯一一种基于约定而非特定方法要求设计方法签名的常见情况。它鼓励我们传递一个非类型化的参数,而传递发送方可能有意义,也可能没有意义。它导致我们忽略参数,不信任参数的值,并将对象强制转换为更特定的类型,因为我们“只知道”它们到底是什么


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

我在这些指南中看到了一件奇怪的事情:为什么不建议您创建自己的委托来处理事件?@RodrigoVedovato:这有什么意义<代码>事件处理程序足够好了。