我应该停止违反.NET事件准则吗

本文关键字:事件 NET 我应该 | 更新日期: 2023-09-27 17:58:19

我发现自己一次又一次地按照指导原则在C#中实现事件,然后当客户端代码不需要指导原则添加的任何好处时,又回到了只使用Action的更简单的实现。

可以说,我将添加一个省略发送方对象(除非实际需要)是一件好事,因为它促进了触发器和处理程序的解耦。一般来说,我认为避免编写不需要的代码是一个好习惯。

我的意思不是说这些指导方针应该总是被忽视,遵循它们有的好处(请参阅下面的链接)。我的问题是我是否应该总是跟随它。

下面的示例显示了"幼稚事件"模式与指导方针模式相比是多么简洁。

// This is neat
class NaiveEvents
{
    public event Action<string> OnAlert;
    public void TriggerOnAlert(string message)
    {
        OnAlert(message);
    }   
}
// Is this bloated?
class ProperEvents
{    
    public event EventHandler<OnAlertEventArgs> OnAlertEvent;
    public void TriggerOnAlert(string message)
    {
        OnAlertEvent(this, new OnAlertEventArgs(message));
    }
    public class OnAlertEventArgs : EventArgs
    {
        private readonly string _message;
        public OnAlertEventArgs(string message)
        {
            _message = message;
        }
        public string Message { get { return _message; } }
    }
}
class EventsDemo
{    
    public static void DemoNaiveEvents()
    {
        var ev = new NaiveEvents();
        ev.OnAlert += (msg) => { Console.WriteLine(msg); };
        ev.TriggerOnAlert("Hello World");
    }
    public static void DemoProperEvents()
    {
        var ev = new ProperEvents();
        ev.OnAlertEvent += (sender, args) => Console.WriteLine(args.Message);
        ev.TriggerOnAlert("Hello World");
    }
}

请参阅指南:http://msdn.microsoft.com/en-us/library/w369ty8x.aspx

好处:举办符合Net准则的活动有什么好处?

谢谢!

我应该停止违反.NET事件准则吗

准则或惯例是任意的,它们都不适合所有情况、环境、解决方案或观点,但这就是创建这些文档的原因:标准化

有时一些指导方针看起来毫无用处,但我的愚蠢观点是永远不要遵循指导方针和/或惯例,这将比不这样做更糟糕

可维护性、代码重用性、可预测性、可读性和每天不讨论的情况,因为每个开发人员都对琐碎的事情有自己的看法,对我来说,这比任何事情都更有价值。

关注您当前的问题,基于我上面所说的,即使没有性能或设计质量方面的好处,我也建议并建议,如果某些软件开发是出于专业目的,也必须遵循全球指南和惯例。如果是开放源码的音频,也应该遵循这些。

作为一名爱好者和专业开发人员,我喜欢按照事实上的编码标准编写、阅读和维护代码,因为我知道每个人都会理解我的工作——显然,文档是一个优势。

在这种情况下(以及类似情况下),我的设计通常与应用程序和库代码不同。

对于可重用库,我倾向于更多地遵循指导方针,因为这提供了更好的版本控制语义。更改库的公共api是相当烦人的。

在应用程序代码中,我倾向于妥协更多。重构这样一个仅在单个解决方案中使用的事件处理程序并没有那么多工作。因此,使用简化的模式是可以的。

从我的角度来看,遵循该模式的最大好处是可以拥有可互换的事件处理程序。例如,如果您定义了

public void OnClick(object sender, EventArgs e)

方法处理某个地方的点击事件,如果需要,将其连接到您的OnAlert事件,而不必包装签名,这将是微不足道的。然而,在C#>3.0中使用lambdas做这件事并不重要,因此增益可能很小。在匿名代表的前一天,这很难做到,因此遵循

指南是有意义的