为什么我们指定一个委托和一个事件,为什么不在 C# 中使用一个事件?
Why do we specify a delegate along with an event, why not just use an event in C#?
为什么我们要指定委托和事件,为什么不直接在 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;
?
正如您在问题中提到的,该事件提供了订阅和取消订阅的机制。然而,委托需要定义可以处理事件的方法的签名。有一个默认签名(带参数 sender 和 args 的 void),但您可以为 EventArgs 使用另一种类型,例如也可以省略 sender 参数。
此外,还有一个 pre-defined delegate EventHandler
可供您使用,因此如果您坚持使用默认签名并使用 EventArgs
,则不必自己创建委托作为参数。
internal event EventHandler GoodsArrived;
如果您想为事件参数提供自定义 class,您可以使用 generic version of the delegate。
public class MyEventArgs : EventArgs
{
// ...
}
internal event EventHandler<MyEventArgs> GoodsArrived;
至于您的更新,如果您使用一个开箱即用的 EventHandler
代表,您就快完成了。你有一个标准的签名,不需要自己创建一个委托。
将事件基于委托的决定提供了很多您可能需要也可能不需要的灵活性。您可以定义只使用正确参数集的事件,也可以为多个事件重复使用现有委托。默认的 EventHandler
实现大大简化了事情,并支持您定义符合最佳实践的事件(不带走灵活性)。
根据我的观点和经验,直接在活动中定义签名不会增加很多。只需使用开箱即用的 EventHandler
委托;您可以立即识别签名,而不必自己定义委托。
为什么我们要指定委托和事件,为什么不直接在 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;
?
正如您在问题中提到的,该事件提供了订阅和取消订阅的机制。然而,委托需要定义可以处理事件的方法的签名。有一个默认签名(带参数 sender 和 args 的 void),但您可以为 EventArgs 使用另一种类型,例如也可以省略 sender 参数。
此外,还有一个 pre-defined delegate EventHandler
可供您使用,因此如果您坚持使用默认签名并使用 EventArgs
,则不必自己创建委托作为参数。
internal event EventHandler GoodsArrived;
如果您想为事件参数提供自定义 class,您可以使用 generic version of the delegate。
public class MyEventArgs : EventArgs
{
// ...
}
internal event EventHandler<MyEventArgs> GoodsArrived;
至于您的更新,如果您使用一个开箱即用的 EventHandler
代表,您就快完成了。你有一个标准的签名,不需要自己创建一个委托。
将事件基于委托的决定提供了很多您可能需要也可能不需要的灵活性。您可以定义只使用正确参数集的事件,也可以为多个事件重复使用现有委托。默认的 EventHandler
实现大大简化了事情,并支持您定义符合最佳实践的事件(不带走灵活性)。
根据我的观点和经验,直接在活动中定义签名不会增加很多。只需使用开箱即用的 EventHandler
委托;您可以立即识别签名,而不必自己定义委托。