C# 和 VB.NET 之间最重要的功能差异是什么?

What are the most important functional differences between C# and VB.NET?

提问人:Larsenal 提问时间:8/15/2008 更新时间:2/11/2015 访问量:10378

问:

当然,在一般语法上存在差异,但还存在哪些其他关键区别?有一些区别,对吧?

C# vb.net 比较

评论

3赞 EBGreen 8/18/2008
我认为,在这个问题上缺乏宗教辩论表明它们有多么相似。:)

答:

9赞 Rob Allen 8/15/2008 #1

自 .Net 2.0 发布以来,这个话题已经有很多面对面的时间。请参阅这篇维基百科文章以获取可读的摘要。

3赞 Tom Grochowicz 8/15/2008 #2

这是一个非常全面的参考。

2赞 csmba 8/15/2008 #3

由于我假设您可以谷歌,因此我认为指向更多网站的链接并不是您正在寻找的。

我的回答是:根据开发人员的历史进行选择。C#更像JAVA,可能更像C++。 VB.NET VB 程序员来说更容易,但我想这不再是一个真正的问题,因为没有来自旧 VB 的新 .NET 程序员。

我的观点是 VB 比 C# 更有效率,似乎它在生产力工具(例如智能感知)方面总是领先,我会向有问题的人推荐 vb 而不是 c#。当然,知道自己更喜欢 c# 的人不会问,而 c# 可能是他的正确选择。

33赞 Luke 8/15/2008 #4

链接的比较非常彻底,但就主要差异而言,我会注意到以下几点:

  • C# 具有匿名方法VB 现在也有了这些
  • C# 具有 yield 关键字(迭代器块)VB11 添加了这个
  • VB 支持隐式后期绑定(C# 现在通过 dynamic 关键字具有显式后期绑定)
  • VB 支持 XML 文本
  • VB 不区分大小写
  • 更多 VB 的开箱即用代码片段
  • 更多适用于 C# 的现成重构工具Visual Studio 2015 现在为 VB 和 C# 提供相同的重构工具。

一般来说,MS对每种语言的关注点各不相同,因为这两种语言的目标受众非常不同。这篇博文对目标受众进行了很好的总结。确定你属于哪个受众可能是一个好主意,因为它将决定你将从 Microsoft 获得什么样的工具。

评论

2赞 Jonathan Allen 9/9/2008
VB 具有匿名函数,只要它们返回一个值即可。没有匿名方法这样的东西。根据定义,方法是一个隐式接受对象引用的命名函数。
2赞 AlwaysAProgrammer 5/8/2010
VB 没有 C# 支持的 yield 关键字
0赞 jeroenh 8/26/2010
C# 现在还支持通过关键字进行后期绑定的形式。这与 VB.Net 仍然不同:在 VB 中,您可以通过在项目级别或文件级别打开或关闭“Option Strict”来允许绑定。在 C# 中,通过使用关键字,后期绑定支持更加明确(在语句级别)。dynamicdynamic
3赞 kodkod 12/17/2012
VB.Net 现在有 Yield 关键字。另请参见 stackoverflow.com/questions/97381/yield-in-vb-net
0赞 andre_ss6 2/8/2015
正如其他人所指出的,VB 也有关键字,它是在 VB 11 中添加的。此外,C# 还支持通过类型(从 C# 4 开始)进行隐式后期绑定;它的行为类似于 VB 中的类型,选项严格关闭。最后,VS 2015 为 C# 和 VB 启用了相同的重构工具。YielddynamicObject
1赞 Keith 8/15/2008 #5

除了语法,不再那么多了。它们都编译为完全相同的 IL,因此您可以将某些内容编译为 VB 并将其反映到 C# 中。

大多数明显的差异是句法糖。例如,VB 似乎支持动态类型,但实际上它们和 C# 一样是静态的——VB 编译器会弄清楚它们。

Visual Studio 在 VB 中的行为与 C# 不同 - 它隐藏了许多功能,但增加了后台编译(非常适合小型项目,占用资源用于大型项目)和更好的代码片段支持。

随着 C#3 中越来越多的编译器“魔力”,VB.Net 确实落后了。VB 现在唯一拥有的 C# 所没有的就是关键字 - 这是值得商榷的。handles

@Tom - 这真的很有用,但有点过时了 - VB.Net 现在也支持 XML 文档'''

@Luke - VB.Net 仍然没有非方法,但现在支持 lambda。

评论

0赞 Jonathan Allen 9/9/2008
你完全忘记了VB的XML支持。
0赞 Keith 9/10/2008
啊,是的,当然。VB 支持内联 XML - 我仍然不确定像这样混合数据和代码的好处。
5赞 Seibar 8/15/2008 #6

这可以被视为语法,但 VB.NET 区分大小写,而 C# 区分大小写。

评论

4赞 David 6/5/2010
哦,这是一个功能,好吧。继续,尝试调试一堆代码,其中 intcounter 和 intCounter 是两个不同的变量。两者之间应该没有区别。区分大小写是计算能力要昂贵得多的时代遗留下来的(解析“A”<>“a”的行比弄清楚它们真的一样要快)。
0赞 DevelopingChris 8/15/2008 #7

当它到达 IL 时,一切都只是位。这种不区分大小写只是预编译器传递。 但普遍的共识是,vb 更冗长。 如果你能写 c#,为什么不省去你的眼睛和手,写少量的代码来做同样的事情呢?

2赞 James Nguyen 8/18/2008 #8

尽管 C#3 上的语法糖确实推动了标准的发展,但我必须说 VB.Net 中的一些 Linq to XML 的东西看起来相当不错,并且使处理复杂、深度嵌套的 XML 变得更容易忍受。只是一点点。

0赞 Vaibhav 8/18/2008 #9

一个明显的区别是它们如何处理扩展方法(Vb.Net 实际上允许 C# 不允许的东西 - 传递将扩展方法定义为 ref 的类型):http://blog.gadodia.net/extension-methods-in-vbnet-and-c/

2赞 Vaibhav 8/18/2008 #10

一个明显的区别是它们如何处理扩展方法(Vb.Net 实际上允许 C# 不允许的东西 - 传递将扩展方法定义为 ref 的类型):http://blog.gadodia.net/extension-methods-in-vbnet-and-c/

评论

0赞 supercat 1/30/2013
太糟糕了,如果尝试在只读上下文中使用这样的扩展方法(编译器复制值并将副本作为参数 --grr 传递),则不会发出警告。ref
1赞 the_lotus 8/27/2010 #11

在我看来,最大的区别是能够用 C# 编写不安全的代码。

1赞 winwaed 12/21/2010 #12

虽然 VB.NET 支持尝试...catch 类型异常处理,它仍然具有类似于 VB6 的 ON ERROR 的内容。ON ERROR 可能会被严重滥用,在绝大多数情况下,尝试......渔获量要好得多;但是,在处理 COM 超时操作时,ON ERROR 可能很有用,其中错误可以被捕获、解码,并且最终的“重试”是简单的一行。 你可以用try做同样的事情...捕获,但代码要混乱得多。

0赞 winwaed 1/3/2011 #13

是的,VB.NET 修复了大部分 VB6 问题并使其成为正确的 OOP 语言 - 即。在功能上与 C# 相似。尽管如此,我倾向于更喜欢 C#,我确实发现旧的 VB ON ERROR 构造对于处理 COM 互操作超时很有用。不过要明智地使用一些东西 - ON ERROR 很容易被滥用!!

1赞 Durgesh Khandal 1/14/2013 #14

这个主题在维基百科和哈丁有简要描述。

http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Visual_Basic_.NET http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

只需仔细阅读并做笔记即可。