我对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);
答案 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”委托类型兼容的方法。