我应该停止破坏.NET事件指南吗?

Mat*_*ari 6 .net c# events event-handling

我一遍又一遍地发现自己按照指南在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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

好处:使事件符合Net准则有什么好处?

谢谢!

Cod*_*aos 1

我在这种情况(以及类似情况)中的设计通常因应用程序和库代码而异。

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

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