接口中的C#事件 - 来自vb.net程序员的混淆

时间:2010-02-04 18:23:07

标签: c# vb.net events interface

我对c#中的事件有一些真正的困惑...如果我在界面中有这个代码:

Event OnBeforeSaving(ByVal Sender As TEntity, ByVal EventArgs As CancelEventArgs)

如何在c#中使用?当我通过转换器运行时,它给了我这个

event OnBeforeSavingEventHandler OnBeforeSaving;
delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs);

我不确定我是否理解发生了什么......在我脑海中,代码应该合并。这是对的吗?

event OnBeforeSaving(TEntity Sender, CancelEventArgs EventArgs);

4 个答案:

答案 0 :(得分:9)

  

我不确定我是否理解发生了什么......在我脑海中,代码应该合并。这是对的吗?

没有。在VB.NET中,您可以将它组合在一行中。 Event关键字允许您指定正在处理的委托类型的完整签名。

但是,在C#中,您需要明确告诉事件它将使用哪种类型的委托。如果它不是标准委托类型,那么您还必须声明委托。这就是您的转换器为您所做的事情。

话虽如此,在这种情况下,这个:

delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs);
event OnBeforeSavingEventHandler OnBeforeSaving;

可能应该替换为:

event EventHandler<CancelEventArgs> OnBeforeSaving;

这是因为框架中有一个内置的EventHandler<T>类型,它遵循建议的事件模式,指定发件人应该是 System.Object ,并且EventArgs应该是EventArgs的子类。但是,这与您的VB.NET代码并不完全相同,因为您将发件人限制为TEntity类型。

更好的方法是使用内置的CancelEventHandler类型:

event CancelEventHandler OnBeforeSaving;

这与EventHandler<CancelEventArgs>基本相同,但更期望,因为有一个专门用于取消的框架事件处理程序类型。

答案 1 :(得分:1)

.Net要求事件属于委托类型。

VB编译器将自动创建委托类型; C#编译器会强制您自己创建它。

答案 2 :(得分:0)

event EventHandler<CancelEventArgs> OnBeforeSaving;

答案 3 :(得分:0)

这一行:

delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs);

定义了一个名为“OnBeforeSavingEventHandler”的新类型。它是一个委托类型,它定义了一个方法调用,它接受TEntity和CancelEventArgs参数并且不返回任何内容。

这一行:

event OnBeforeSavingEventHandler OnBeforeSaving; 

声明一个类成员,它是一个名为“OnBeforeSaving”的事件。此事件的类型为“OnBeforeSavingEventHandler”。因此,任何希望订阅此事件的对象都必须具有与“OnBeforeSavingEventHandler”委托类型兼容的方法。