C#相对于VB的优势

11

C#相比VB.NET在某些项目中更为适合的原因是什么?

性能? 功能? 库/组件? 声誉? 可靠性? 可维护性? 易用性?


基本上,C#能做到的事情,使用VB就不可能实现,反之亦然。在选择C#或VB进行项目开发时需要考虑这些因素。

19个回答

33

C# 和 VB 基本相同,但有一些细微的差别。除了明显的语法差异之外,还有以下差异:

  1. C# 可以调用不安全的代码。
  2. VB 有可选参数(在 C#4.0 中推出)。
  3. 当进行后期绑定调用时,使用 VB 更加容易(在 C# 4.0 中推出),这与第二点使得使用 VB 进行 Office 自动化变得更加简洁。
  4. VB 有许多“帮助器”函数和类,如 My 命名空间,但所有这些都可以被 C# 访问。
  5. VB 不区分大小写。

C# 的语法遵循与 C 和 Java 类似的语法规则,这使得从这些语言过渡到 C# 更加舒适,而 VB 则更适合 VB 用户。就性能、库或组件而言,它们几乎是相同的。

至于选择哪种语言,请选择最符合您习惯的语言,除非您需要执行不安全操作。经过多年的 VB 开发,我喜欢不必再编写 If yadada then.....End If if (yadaya){....} 这样冗长的语句,这节省了我的手指打字时间(这些时间可以用来回答 Stack Overflow 上的问题)。

编辑

刚刚了解到 C# 和 VB 的另一个区别是,VB 支持过滤异常,因此您可以使用以下伪代码:

try
{
   //do something that fails
}
catch(Exception ex when ArgumentException, 
      ArgumentNullException, FormatException)
{
  //Only handle these three types
}

这与以下能力不应混淆:

try
{ 
    //something that fails
}
catch(ArgumentException)
{ 
    //Log Error
}
catch(ArgumentNullException)
{
    //Log Error
}

在这种情况下,你可以在VB中定义一段代码来处理多种类型的异常。

编辑

还有一些差异。

  1. VB的Is运算符比较两个对象以确定它们是否相同,它编译为CEQ IL指令,而C#编译为isinst IL。 因此,以下语句是等效的

c# if (foo is FooObject){}

vb If TypeOf foo is FooObject then

  1. 还如评论中所提到的,C#没有类似的参数。 您需要使用RegEx类。

1
哇,终于C#有可选参数了?太好了!哈哈 :D - CodeAndCats
1
我再也不用看到有30个构造函数的类,覆盖所有可能的参数组合了。 - JoshBerke
2
你确定VB是不区分大小写的吗?我认为只有Visual Studio会为您修正变量和方法的大小写。 - Rune Grimstad
1
@Josh 关于腕隧道综合症:VS2008 VB IDE中的智能感知和自动完成功能非常好,如果你使用得当,实际输入结束块语句的击键几乎为零-它会帮您全部输入。此外,在我的看法中,可读性更好,因为结束块是不同的,而不仅仅是嵌套的}。 - ChrisA
我可以没有可选参数。我更喜欢使用重载。如果签名太复杂并需要太多变化,则绝对是代码异味。 - Joseph Ferris
显示剩余13条评论

21

我认为Kathleen Dollard在她的博客文章中提供了关于这个问题的优秀概述:

C#程序员在编写VB之前需要知道什么

她的第一个建议是:

1) 克服尊重障碍或在开始之前放弃。VB是一门很棒的语言。


+1 非常好的链接!谢谢,我更喜欢 C#,是时候学习一些 VB.NET 了。 - kenny
我喜欢我的VB.NET。那是一篇很棒的文章。+1 - Booji Boy
+1 - 很棒的帖子,但是她网站的配色方案很讨厌(虽然这不重要)... - Dscoduc

15

在极客圈中赢得信任。

(而且不要假装这不重要!)


1
来吧,一个理性的程序员真正想要的是把工作做好,他为什么要在意所谓的“街头信誉”呢?如果项目经理喜欢C#那是另一回事 :) - Robin Rodricks
当我从C#转到VB时,我不禁感觉自己失去了一些编程能力。 - IAbstract

11

其他人已经涵盖了很多区别 - 正如多次提到的那样,它们是几乎等效的语言。以下是我所见过但未涵盖的一些差异:

VB9具有:

  • XML文字
  • 可变匿名类型(呃)
  • 更多LINQ支持在语言中(C#仅覆盖少数运算符)
  • 语言中的一堆额外位,编译成对Microsoft.VisualBasic程序集的调用。(C#倾向于是一个带有.NET框架支持的小型语言。)
  • DateTime文字

C#3具有:

  • 更好的lambda表达式支持:如果我没记错,在VB中无法编写带有块体的lambda表达式。
  • 迭代器块。
  • 扩展方法的语法(而不是装饰方法使用属性)

我认为还有更多,但我想把它们加入到混合中。


Microsoft.VisualBasic程序集是.NET框架的一部分,许多C#程序都使用它。 - Jonathan Allen
1
添加:C# 可以在不支持 VB 的平台上工作,例如 XNA/XBox 360。 - Jonathan Allen
VB10支持使用Lambda表达式编写多行代码块,适用于函数和子程序。 - Steve Horn

9
当你遇到问题时,通常可以通过谷歌搜索代码示例来解决问题,这是提高生产力的重要因素。在我使用Delphi时,我不得不将C语言代码示例转换为Object Pascal - 这是可行的,但很繁琐,即存在很多摩擦。因此,不要低估这个事实...

绝大多数.NET代码示例都是用C#编写的!


6
正确而且重要,这就是为什么每个VB程序员都应该了解C#,反之亦然。 - Konrad Rudolph
@Mike和Konrad - 我同意!VB<>C#是一件重要的事情。我想知道为什么他们不一起教,因为它们本来就很相似。 - Robin Rodricks
@Konrad:因为我的开发经理是VB编码器,所以我不得不做很多VB到C#再到VB的转换。能够来回切换肯定会有所帮助。 - IAbstract

5
在早期的VB.NET版本中,这种差异更加明显,但是在当前版本中,没有显著的差异。VB直接支持代码中的XML文本,而C#不支持。C#支持不安全代码,而VB则不支持。从技术上讲,这两个是最大的区别。还有许多小的变化,但它们并不重要。我更喜欢C#,因为我认为语法更简洁。很容易识别代码块,而不是看到一堆关键字,但这只是纯粹的个人偏好。选择你和你的团队更熟悉的那一个。

1
在代码中使用XML文字是一个可怕的想法,对于语言来说是一种丑陋的存在,我个人认为。我从来不是VB的粉丝,但这基本上已经敲定了。此外,使用下划线来包装单行语句也是相当不必要的。 - Chris
4
""不是多余的。它使得你"编程行"末尾的";"变得无用了。99%的情况下,你不需要使用""。 - splattne
1
我同意Chris的观点,特别是在LINQ时代,代码看起来真的很丑陋,用了下划线_. - Mehrdad Afshari
同意使用下划线,但我认为XML字面量是一个好主意。 - kenny
Chris...你有没有真正使用过VB .NET中的XML文字? - Ryan Lundy

4
VB.Net 有一个根命名空间,而 C# 则有一个默认命名空间,两者并不相同。因为当你在 VB.Net 中有一个根命名空间时,它总会在命名空间前面添加该根命名空间。
例如:如果在 VB.Net 中有一个名为 namespace1 的根命名空间,并且您将其添加到文件中,则会如下所示:
Namespace namespace1
  Public Class class1
  End Class
End Namespace

如果在C#中你有一个名为namespace1的默认命名空间,并且你在文件中这样使用它:那么你将不得不把它称为namespace1.namespace1.class1。

namespace namespace1{
  public class class1{}
}

那么您仍然可以将其称为namespace1.class1。

这是Visual Studio默认设置的问题,而不是VB.net语言的问题。这可以被解决。 - BradC

3

3

VB对错误的反馈更好。在C#中,您需要更频繁地编译以获取语法中的所有错误。


1
没错。我对C#作为一种语言没有宗教上的反感 - 我主要使用VB.NET,但是当我需要时,C#也很好用。但是VB IDE的预编译/智能感知/自动完成系统要好得多。当我在今年早些时候的合同中使用C#时,使用VS2008 C# IDE就像回到了5年前。 - ChrisA
有了ReSharper,这不再是个问题。现在我离不开它了。 - Andy McCluggage
编辑时编译对于大型项目来说实际上是一个问题,因为它会显著降低集成开发环境的性能。 - Robin Rodricks
我听说这个问题在VS2k8SP1中已经得到缓解,但我们这里还没有升级。 - Powerlord
@chrissie1 - 编辑时,只有当前正在编辑的文件被重新编译。我曾经有一个项目,其中一个单一类别的单一文件有20000行代码,相信我,即使在我的3Ghz电脑上,编辑速度也很慢,打字速度也很慢!后来我使用“Partial Class”将该类别拆分成多个文件。 - Robin Rodricks
显示剩余3条评论

3
我认为C#的最大优势在于绝大多数开源项目、示例代码和博客片段都是用C#编写的。虽然可以使用工具(或自己思考)将其转换为VB.NET,但对于VB开发人员(例如我),仍然是一项单调乏味的任务。
即使您每天都使用VB.NET编写代码,您仍需要能够阅读C#。
从技术上讲,它们共享相同的框架、性能和内存特征以及相同的类型系统,因此我发现很难区分这两者。
大多数优秀的开发人员应该能够在几天的调整时间内在这两种语言之间切换。
我的核心挫败感在于我已经写了成百上千次:
String lastName as String

并想知道为什么它从未编译过!


虽然有点痛苦,但C#是王者。我讨厌分号错误和大小写敏感。我认为VB的冗长使其更易读。 - Zack Peterson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接