对于使用VB事件无法做到的C#事件,你能做些什么吗?

时间:2009-03-30 20:50:01

标签: c# vb.net events delegates

我的朋友主要是VB开发人员,他一次又一次地说,用VB编写事件比用C#编写事件要简单得多。我对这个问题的看法是它可能更容易,但如果没有增加复杂性的原因,它们可能会在C#中变得如此简单。任何人都可以告诉我,是否有任何额外的灵活性或任何能力,一般来说,可以用C#事件而不是VB.Net事件来完成?

5 个答案:

答案 0 :(得分:4)

C#唯一能想到的是能够使用匿名函数订阅void返回事件(几乎所有事件)。 VB.Net 9.0仅支持返回值的Lambda表达式(这在VB 10.0中是固定的)。

VB在C#中有一些关于事件的灵活性

  • 支持Relaxed Delegates。这允许VB使用事件处理程序,它只需要事件类型中的参数子集(主要用于空参数函数)。
  • Handles子句使删除设计器生成事件变得更加容易,而不是必须通过.Designer.cs文件挖掘C#
  • RaiseEvent关键字使VB.Net
  • 中不存在空事件检查问题

答案 1 :(得分:2)

我大多数时候都喜欢VB到C#,但我两个都很流利。

在我的脑海中,有两个地方我知道VB.Net让它变得更容易。一个是你在举起活动之前不必检查null。那里可能会有一些权衡,但我不知道它。

另一个是添加Handles关键字。您可以声明一个完整的方法来处理事件,并在一个语句中将其连接到事件。这对于VB来说是一个明显的优势,因为如果没有该关键字,您仍然可以执行长形式的所有操作。这只是一小段语法糖。在C#中唯一可以做到这一点的方法是使用lambda表达式/匿名委托。

其余的语法非常简洁:您更喜欢“+=”还是“AddHandler”?

答案 2 :(得分:1)

使用VB,你不能暗示签名,而不是陈述委托类型吗?

Public Event OnChange(ByVal Text As String)

我不确定这是件好事,但是......

此外 - RaiseEvent是否自动处理空值(非订阅事件)?当然,要做的很简单。

答案 3 :(得分:0)

您的朋友可能习惯于通过从源代码页顶部的两个组合框中选择控件和事件来创建事件处理程序。在C#中你手动编写+ =处理程序。

答案 4 :(得分:0)

在C#中,您可以拥有虚拟事件并在派生类中覆盖它们。在VB.NET中没有这样的东西。