我对 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/