use*_*479 1 c# vb.net events interface
我对c#中的事件有一些真正的困惑...如果我在接口中有这个代码:
Event OnBeforeSaving(ByVal Sender As TEntity, ByVal EventArgs As CancelEventArgs)
Run Code Online (Sandbox Code Playgroud)
怎么应该在c#中?当我通过转换器运行时,它给了我这个
event OnBeforeSavingEventHandler OnBeforeSaving;
delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs);
Run Code Online (Sandbox Code Playgroud)
我不确定我是否理解发生了什么......在我脑海中,代码应该合并.它是否正确?
event OnBeforeSaving(TEntity Sender, CancelEventArgs EventArgs);
Run Code Online (Sandbox Code Playgroud)
我不确定我是否理解发生了什么......在我脑海中,代码应该合并.它是否正确?
不可以.在VB.NET中,您可以将它组合在一行中.Event关键字允许您指定正在处理的委托类型的完整签名.
但是,在C#中,您需要明确告诉事件它将使用哪种类型的委托.如果它不是标准委托类型,那么您还必须声明委托.这就是您的转换器为您所做的事情.
话虽这么说,在这种情况下,这:
delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs);
event OnBeforeSavingEventHandler OnBeforeSaving;
Run Code Online (Sandbox Code Playgroud)
可能应该替换为:
event EventHandler<CancelEventArgs> OnBeforeSaving;
Run Code Online (Sandbox Code Playgroud)
这是因为有一个内置EventHandler<T>的框架,以下事件所建议的模式,指定发送者应该是一个类型System.Object的,并且EventArgs的应的一个子类的EventArgs.但是,这与您的VB.NET代码并不完全相同,因为您将发件人限制为某种TEntity类型.
更好的是使用内置的CancelEventHandler类型:
event CancelEventHandler OnBeforeSaving;
Run Code Online (Sandbox Code Playgroud)
这基本上与EventHandler<CancelEventArgs>预期相同,但更期望,因为有一个专门用于取消的框架事件处理程序类型.