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

标签 c# vb.net events interface

我对 C# 中的事件有一些真正的困惑...如果我在接口(interface)中有这段代码:

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);

最佳答案

I'm not sure if I understand what is going on... in my head the code should be combined. Is this correct?

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

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

也就是说,在这种情况下,这是:

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> 基本相同,但更符合预期,因为有一个专门用于取消的框架事件处理程序类型。

关于接口(interface)中的 C# 事件 - 来自 vb.net 程序员的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2202123/

相关文章:

c# - 通过 Cmd 启动 Windows 应用程序与控制台应用程序

asp.net - Excel 单元格对齐方式 : Numerical values for e. g。 xlLeft、xlRight 还是 xlCenter?

c# - 是否有更好的方法在 CLR 中验证 SqlXml?

JQuery 检查事件绑定(bind)

javascript - 'mousedown' 的 addEventListener 与 'click' 的 addEventListener 不同

c# - 通过代码将文本框的高度绑定(bind)到父级

c# - 在一个Producer和Multi-Consumer实现中等待所有Consumer都处于waiting状态

javascript - 如何使用 Jquery 在表上追加输入类型提交元素并绑定(bind)它?

vb.net - vb 是否有默认的 Windows 路径?

jquery - 单击和双击事件触发