【发布时间】:2019-07-06 23:43:21
【问题描述】:
为什么我们在事件中指定一个委托,为什么不在 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;
?
【问题讨论】:
-
当你不知道它的定义(委托)时,你怎么能有一个事件。如果你订阅了一些东西,你总是需要知道参数等等。或者我不明白你的问题,因为你的第二个代码块不起作用)。
-
我实际上并不完全理解您对第二个替代示例的意思。在那个代码 sn-p 中,
_EventHandler实际上是什么?它没有在任何地方声明,编译器应该如何处理? -
请注意(在此示例中)您可以简单地使用
EventHandler<GoodsInfoEventArgs>而不是声明您自己的委托(尽管GoodsInfoEventArgs需要从EventArgs派生)。 -
当您不知道要提供什么参数时,您将如何触发该事件?委托描述事件处理程序方法将具有哪些参数,因此您的 fire-event-method 应提供哪些参数。
-
@HimBromBeere,为什么不在事件声明中直接指定参数?谢谢。
标签: c# events syntax delegates observer-pattern