为什么我们要指定一个委托和一个事件,为什么不只在C#中使用一个事件呢?

时间:2019-02-13 07:57:42

标签: c# events syntax delegates observer-pattern

我们为什么要在事件中指定委托,为什么不在C#中使用事件呢?

例如,我有以下代码:

class Shop
{
    internal delegate void _EventHandler(object sender, GoodsInfoEventArgs e);
    internal event _EventHandler GoodsArrived;

    public void BringGoods(string goods)
    {
        if (GoodsArrived != null)
        {
            GoodsArrived(this, new GoodsInfoEventArgs(goods));
        }
    }
}

为什么开发C#的人不能通过以下方式实现事件:

class Shop
{
    internal event _EventHandler GoodsArrived;

    public void BringGoods(string goods)
    {
        if (GoodsArrived != null)
        {
            GoodsArrived(this, new GoodsInfoEventArgs(goods));
        }
    }
}

我的意思是没有代表。

我知道该事件在C#中的工作方式。如果有的话,它将只调用所有订阅的委托,否则将等于null。我也知道事件与代表之间的区别。该事件仅允许添加或减少代表,但不允许更改指针(我们可以对事件执行+=-=操作,但不能对事件执行=操作事件),而委托则允许执行所有加法,减法和赋值操作。因此,该事件是委托周围的包装器,并且包装器允许控制委托可以更改的方式。

话虽如此,我不明白在要求定义事件的程序的每个位置定义一个委托的背后原因。

如果您不理解我的问题,请向我询问,我将提供更多信息。

谢谢。

对不起,我感到困惑。我的意思是,为什么不使用这样的东西:

internal event _EventHandler(object sender, GoodsInfoEventArgs e) GoodsArrived;

1 个答案:

答案 0 :(得分:6)

正如您在问题中提到的,事件提供了订阅和退订的机制。但是,要求委托定义可以处理事件的方法的签名。有一个默认签名(带参数sender和args的空值),但是您可以对EventArgs使用另一种类型,例如也可以省略sender参数。

此外,您可以使用pre-defined delegate EventHandler,因此如果您坚持使用默认签名并使用EventArgs作为参数,则不必自己创建委托。 。

internal event EventHandler GoodsArrived;

如果要为事件参数提供自定义类,则可以使用generic version of the delegate

public class MyEventArgs : EventArgs 
{
  // ...
}

internal event EventHandler<MyEventArgs> GoodsArrived;

对于您的更新,如果您使用一个现成的EventHandler委托,那么您就快到了。您具有标准签名,不需要自己创建委托。

将事件基于委托人的决定提供了您可能需要或可能不需要的很多灵活性。您可以定义仅使用正确参数集的事件,也可以将现有委托重用于多个事件。默认的EventHandler实现大大简化了工作,并支持您定义符合最佳做法的事件(而不会失去灵活性)。

从我的观点和经验来看,直接在事件中定义签名不会增加太多。只需使用现成的EventHandler委托;您可以立即识别签名,而不必自己定义委托。