C#优于VB

什么在C#.NET中使它更适合某些项目而不是VB.NET?

性能?,function?,库/组件?,声誉?,可靠性? 可维护性?,轻松?


基本上C#可以做任何事情,使用VB是不可能的,反之亦然。 在为项目选择C#/ VB时您必须考虑的事项

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

  1. C#可以调用不安全的代码
  2. VB有可选参数(进入C#4.0)
  3. VB在进行后期绑定调用时更容易使用(来自C#4.0)这个和数字make 2使用VB来使办公自动化更加清洁。
  4. VB有一堆“辅助”函数和类,如My命名空间; 但是,所有这些都可以被C#访问
  5. VB不区分大小写

C#的语法遵循与c和java类似的语法,这使得从这些语言转换起来更加舒适,因为VB对VB用户来说更舒服。 到目前为止,性能,库或组件几乎完全相同。

至于选择哪一个,除非你需要做不安全的操作,然后选择最自然的语言。 经过多年的VB开发人员,我喜欢不必写作如果yadada然后…..结束如果(yadaya){….}保存我的腕管一些额外的击键(然后可以用来回答SO题)

编辑

刚刚学到了另一个区别,因为C#和VB是VB支持过滤的exception,所以你可以像这样伪:

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世界中以不同方式处理exception,您可以定义一段代码来处理多种类型的exception。

编辑

更多的差异。

  1. VB的Is运算符比较两个对象以确定它们是否相同,它编译为CEQ IL指令,其中C#编译为isinst IL。 所以以下是等效的陈述

c# if (foo is FooObject){}

vb If TypeOf foo is FooObject then

  1. 同样如评论中所述,我希望我能看到它们给你信用,但C#没有类似的参数。 您需要使用RegEx类。

我认为Kathleen Dollard的这篇博文提供了一个很好的概述:

在编写VB之前,C#编码器应该知道什么

她的第一个建议是:

1)在开始之前克服尊重或戒烟。 VB是一门很棒的语言。

极客之间的街头信誉。

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

其他人已经涵盖了很多差异 – 正如已经多次说过的那样,它们几乎是等同的语言。 就我所见,有些差异尚未涵盖:

VB9有:

  • XML文字
  • 可变匿名类型(urgh)
  • 语言中支持更多LINQ(C#仅涵盖少数运营商)
  • 语言中的一大堆额外位被编译为调用Microsoft.VisualBasic程序集。 (C#更喜欢使用.NET框架重量的小语言。)
  • DateTime文字

C#3有:

  • 更好地支持lambda表达式:IIRC,你不能用VB中的块体写一个lambda表达式。
  • 迭代器块。
  • 扩展方法的语法(而不是用属性装饰方法)

我怀疑还有更多,但我想我会把它们扔进去。

当您遇到问题时,您通常可以通过Google获取代码示例,该示例显示如何在几分钟内解决问题。 这是提高生产率的重要因素。 当我使用Delphi时,我不得不将代码样本从C转换为Object Pascal – 可行,但是单调乏味,即大量摩擦。 所以不要低估……

绝大多数.Net代码示例都在C#中!

在VB.NET的早期版本中,差异更明显,但是对于当前版本,没有显着差异。

VB直接在代码中支持XML文字,C#不支持。 C#支持不安全的代码而VB则不支持。 从技术上讲,这两者是最大的差异。 有许多小的变化,但它们并不重要。 我更喜欢C#因为我认为语法不那么臃肿。 很容易识别代码块而不是看到一堆关键字,但这是一个纯粹的个人偏好。

选择您和您的团队更熟悉的那个。

VB.Net有一个根命名空间,C#有一个默认的命名空间,它不相同。 因为当你在VB.Net中有一个根命名空间时,它总是会在命名空间之前添加它。

例如:如果你在VB.Net中有一个名为namespace1的rootnamepsace,那么你将它添加到你的文件中。

 Namespace namespace1 Public Class class1 End Class End Namespace 

那么你将不得不将它称为namespace1.namespace.class1

在C#中,如果你有一个名为namespace1的默认命名空间,那你就在你的文件中。

 namespace namespace1{ public class class1{} } 

然后你仍然可以将它称为namespace1.class1

VB最没有的C#特性是yield语句。 它允许您从方法轻松返回延迟评估的IEnumerable。

这是一篇涵盖它的文章: http : //msdn.microsoft.com/en-us/magazine/cc163970.aspx

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

我在C#中看到的最大优势是绝大多数开源项目,示例代码和博客片段都是用C#编写的。 虽然使用工具(或者你的头)很容易将它们转换为VB.NET,但对于VB开发者来说(对我来说)仍然是单调的任务。

即使你每天都在VB.NET中编写,你仍然需要能够阅读C#

从技术上讲,它们共享具有相同性能和内存特性以及相同类型系统的相同框架,因此我发现很难将这两者分开。

大多数优秀的开发人员应该能够在两天之间调整,调整时间为几天。

我的核心挫折在于我写下的数百次:

 String lastName as String 

并想知道为什么它永远不会编译!

在C#中,您可以对事件/代理进行更精细的控制。 但你很少需要这个。

C#还有很多代码示例。

在VB.Net中,(很多)使用后期绑定更容易。 例如,对COM对象(在4.0版本的C#中)。

  • 我在项目中使用C#达90%
  • 我使用VB.Net进行互操作到Excel等

一旦我更了解F#,我可能会将它用于F#更适合的部件。

性能?

没有区别,虽然VB历史上在循环中使用了一个奇怪的索引,这意味着你必须在大多数时间从最高索引中减去1:

 For i = 0 To someArrayOrString.Length - 1 … 

虽然我怀疑这会以任何可衡量的方式影响性能。

另一方面,由于后台编译,VB实际编译速度似乎更快 。 有些人声称这会让IDE反应缓慢,但我从未注意到自己。

能力?

在少数情况下,C#的yield语句非常有用。 VB需要更多的手动工作。 另外,lambda在C#中实现得更好,特别是在语法上。 考虑这两个陈述:

 Parallel.For(1, 10000, i => { // Do something }); 

 Parallel.For(1, 10000, Sub() _ ' Do something ' End Sub) 

除了VB还不能做到这一点的事实,并且禁止在这个地方发表评论,它只是更加混乱,而且通常是禁止的。

库/组件?

相同。

声誉?

不重要。 “街头威望”? 抱歉。 不是一个因素。 克服它,尼克。

可靠性? 可维护性? 缓解?

或多或少相同。 我声称VB更容易,但可能有偏见,无论如何,它只是边缘。

据我了解,语言之间存在差异,尽管它们很小。 我建议您使用您/您的开发人员最满意的语言。 如果他们已经有VB经验,那么我建议VB.Net/vice-versa。

虽然我更喜欢C#的简洁语法。 🙂

由于C#和VB.Net都编译成MSIL,因此它们具有几乎相同的性能,function,库和组件。 reflection可以将MSIL代码解压缩为C#或VB.NET(或许多其他语言)

这基本上离开了我们,C#看起来很像Java和C ++,这使它更具可信度。

我认为Josh对语言差异进行了很好的汇总。

工具支持

但是,Visual Studio处理这些语言的方式也存在差异。 代码片段更容易在C#编辑器中使用,重构也更好。

VB编辑器通过不显示所有选项来简化智能感知。

我确信还有更多的东西,但那些我作为C#’(做很少的VB)注意到的东西。

以下是此追踪尚未涵盖的另一点:

更高的就业能力+更好(更多)开发资源

但现在我不同意这种观点:

VB商店有更多的C#开发商店

如果你对VB更强,那么一些落后的c#雇主会让你处于严重的劣势。 所以也许C#是更好的选择。

另一方面,当您为C#项目雇用人员时,您将能够吸引更多候选人参与iterview并获得更好的技能 – 我不认为细节应该被忽视。

我不得不说,在使用Google搜索示例或文档时,我的经验是C#示例质量比VB示例更好。 这并不是说没有糟糕的C#示例,但是如果你搜索“字典下拉”这样的东西,添加C#将在列表中提供更高质量的答案。

这不适用于并排显示C#和VB代码的示例。

目前,VB.Net的lambda表达式实现很差。 这意味着你无法在C#中做到整洁的事情。 嗯,你可以,但在大多数情况下,它需要一个非常丑陋的解决方法。

这在VB.Net 10.0中得到了解决。

没有旧的cruft,C#中的数组声明没有填充额外的元素。 VB.NET数组填充了额外的元素,因此传统的VB6代码迁移更容易。

C#比VB.NET更加一致

 Button1.Color() = Color.Red Button1.Color = Color.Red 

当一个学生问我什么时候在VB.NET的属性上使用括号时,我无法给出答案。 对于这种错误,很难给出深刻的推理。

与实例和静态成员的一致性。 VB.NET允许访问实例上的静态成员,例如yarn.Sleep(1000),这是一种错误。 https://stackoverflow.com/questions/312419/language-features-you-should-never-use