即使只是一个动作参数就足够了,使用事件?

时间:2015-01-27 12:54:44

标签: c# events delegates

在我的场景中,我有一个课程,偶尔会为我做一些工作,偶尔会对它采取一些行动。实际上的行动将从外部提供。我认为值得一提的是,外部只有一个实例告诉这个类必须做什么。

我已经实现了这样的事情:

public class DelegatePublisher
{
    private Action<byte[], int, int> onCompleted;

    public DelegatePublisher(Action<byte[], int, int> onCompleted)
    {
        this.onCompleted = onCompleted;
    }

    public void Invoke(byte[] buffer, int index, int count)
    {
        onCompleted.Invoke(buffer, index, count);
    }
}

这可以在以后简单地使用:

public class Example
{
    public void Test()
    {
        var byAction = new DelegatePublisher(onDelegate);
    }

    private void onDelegate(byte[] buffer, int index, int count)
    {
        // do stuff
    }
}

调用Invoke后,将调用该操作。 (为了这个最小的例子,我遗漏了所有null目的进行检查)

这符合预期,我很满意这个解决方案。但是,人们一直告诉我应该使用Events。我告诉他们我只需要调用 Action,代码完全可以。经过长时间的讨论,代码现在看起来像这样:

public class EventPublisher
{
    public EventHandler<EventPublisherEventArgs> OnCompleted;

    public void Invoke(byte[] buffer, int index, int count)
    {
        var handler = OnCompleted;
        if (handler != null)
        {
            handler(this, new EventPublisherEventArgs(buffer, index, count));
        }
    }
}

当然是EventArgs

public class EventPublisherEventArgs : EventArgs
{
    public byte[] Buffer
    {
        get;
        private set;
    }

    public int Index
    {
        get;
        private set;
    }

    public int Count
    {
        get;
        private set;
    }

    public EventPublisherEventArgs(byte[] buffer, int index, int count)
    {
        Buffer = buffer;
        Index = index;
        Count = count;
    }
}

我的......好吧,“调用”代码现在看起来像这样:

public class Example
{
    public void Test()
    {
        var byEvent = new EventPublisher();
        byEvent.OnCompleted += onEvent;
    }

    private void onEvent(object sender, EventPublisherEventArgs e)
    {
        // do stuff
    }
}

作为Event这样做有什么好处吗?或者反过来说:使用Action的方式是否有问题?

我使用Events所能告诉我的是,我需要更多的代码,有一个额外的抽象层,可能会连接多个(不需要的)回调,并且需要一个额外的类来保存三个参数。我看到的唯一好处是我遵循一个共同的模式。但是,我已经看到很多代码都将动作作为参数传递,即使在BCL中也是如此,这可能也可以通过事件来解决。

1 个答案:

答案 0 :(得分:1)

  

作为一个活动,这实际上有什么好处吗?

虽然高度自以为是,但是试着摆脱我的观点。

我没有看到任何直接的好处。这通常取决于你需要什么。事件只是代表的包装器,它们增加了另一层抽象(如你所说)。

你必须使用它们吗?不,我认为您的工作代码示例没有任何问题。不要使用某些模式,因为“人们认为它们更好”。跟随他们,因为你看过并看到使用它们的明显好处。在这种特殊情况下,我没有看到任何附加价值。