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

问题描述 投票:2回答:1

为什么我们在事件中指定一个委托,为什么不在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;

?

c# events syntax delegates observer-pattern
1个回答
6
投票

正如您在问题中提到的,该事件提供了订阅和取消订阅的机制。但是,委托需要定义可以处理事件的方法的签名。有一个默认签名(带参数sender和args的void),但您可以为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代表;您可以立即识别签名,而不必自己定义委托。

© www.soinside.com 2019 - 2024. All rights reserved.