【问题标题】:C# events in interfaces - confusion from a vb.net programer接口中的 C# 事件 - 来自 vb.net 程序员的混淆
【发布时间】:2010-02-04 18:23:06
【问题描述】:

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

【问题讨论】:

    标签: c# vb.net events interface


    【解决方案1】:

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

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

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

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

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

    应该换成这个:

    event EventHandler<CancelEventArgs> OnBeforeSaving;
    

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

    最好使用内置的CancelEventHandler 类型:

    event CancelEventHandler OnBeforeSaving;
    

    这与EventHandler&lt;CancelEventArgs&gt; 基本相同,但更符合预期,因为有一个专门用于取消的框架事件处理程序类型。

    【讨论】:

    • CancelEventArgs 确实有一个特定的匹配委托类型。熟悉此事件的用户可能会根据之前的经验输入+= new CancelEventHandler...msdn.microsoft.com/en-us/library/…
    • 没错,好点...不过,在这种情况下,它之前都不会起作用;)但在这里,使用 CancelEventHandler 是最有意义的。
    • 不挑剔(好吧,也许挑剔,但我已经投票了),但事件应该被称为BeforeSaving,并且应该有一个protected virtual void OnBeforeSaving(CancelEventArgs e) 方法来调用它。跨度>
    • @280Z28:您的第一条评论(关于活动名称)应该发给原始发帖人,他在 VB 中将其命名为 OnBeforeSaving。
    • @280Z28: +1,是的,我完全同意——但我再次尝试遵循 OP 的命名...
    【解决方案2】:

    .Net 要求事件为委托类型。

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

    【讨论】:

      【解决方案3】:
      event EventHandler<CancelEventArgs> OnBeforeSaving;
      

      【讨论】:

        【解决方案4】:

        这一行:

        delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs);
        

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

        这一行:

        event OnBeforeSavingEventHandler OnBeforeSaving; 
        

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

        【讨论】:

          猜你喜欢
          • 2017-07-02
          • 2016-07-18
          • 1970-01-01
          • 2021-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-31
          • 2014-02-11
          相关资源
          最近更新 更多