【发布时间】:2018-08-08 18:06:37
【问题描述】:
C#.NET 中的什么使它比 VB.NET 更适合某些项目?
性能?、能力?、库/组件?、声誉?、可靠性?可维护性?,容易吗?
基本上C# 可以做的任何事情,使用VB 是不可能的, 反之亦然。 为项目选择 C#/VB 时必须考虑的事项。
【问题讨论】:
C#.NET 中的什么使它比 VB.NET 更适合某些项目?
性能?、能力?、库/组件?、声誉?、可靠性?可维护性?,容易吗?
基本上C# 可以做的任何事情,使用VB 是不可能的, 反之亦然。 为项目选择 C#/VB 时必须考虑的事项。
【问题讨论】:
C# 和 VB 基本相同,但有一些细微差别。除了明显的语法差异之外,您还有以下差异:
C# 的语法遵循与 c 和 java 类似的语法,这使得它从这些语言过渡更加舒适,而 VB 对 VB 用户来说更舒适。就性能和库或组件而言,它们几乎相同。
至于选择哪一种,除非你需要做不安全的操作,否则选择对你来说最自然的语言。在成为 VB 开发人员多年后,我喜欢不必编写 If yadada then.....End If (yadaya){....} 为我的腕管节省了一些额外的击键(然后可以用于回答 SO问题)
刚刚了解到 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 世界中以不同的方式处理异常,您可以定义一段代码来处理多种类型的异常。
还有一些区别。
c#
if (foo is FooObject){}
vb
If TypeOf foo is FooObject then
【讨论】:
我认为 Kathleen Dollard 的这篇博文很好地概述了这个问题:
What a C# Coder Should Know Before They Write VB
她的第一个建议是:
1) 克服尊重或退出 在你开始之前。 VB是个好东西 语言。
【讨论】:
极客中的街头信誉。
(不要假装这不重要!)
【讨论】:
其他人已经涵盖了很多差异 - 正如多次说过的那样,它们是几乎等效的语言。据我所见,一些尚未涵盖的差异:
VB9 有:
C# 3 有:
我怀疑还有更多,但我想我会把它们混在一起。
【讨论】:
当您遇到问题时,您通常可以在 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.namespace1.class1
在 C# 中,如果你有一个名为 namespace1 的默认命名空间,并且你的文件中有这个。
namespace namespace1{
public class class1{}
}
那么您仍然可以将其称为 namespace1.class1
【讨论】:
我最喜欢的 C# 没有 VB 的特性是 yield 语句。它使您可以轻松地从方法返回一个惰性求值的 IEnumerable。
这是一篇涵盖它的文章:http://msdn.microsoft.com/en-us/magazine/cc163970.aspx
【讨论】:
VB 对错误有更好的反馈。在 C# 中,您必须更频繁地编译以获取语法中的所有错误。
【讨论】:
我看到 C# 的最大优势是绝大多数开源项目、示例代码和博客 sn-ps 都是用 C# 编写的。尽管使用工具(或您的头脑)很容易将这些转换为 VB.NET,但对于 VB 开发人员(如我)来说仍然是一项单调的任务。
即使您每天使用 VB.NET 编写代码,您仍然需要能够阅读 C#
从技术上讲,它们共享相同的框架,具有相同的性能和内存特性以及相同的类型系统,因此我发现很难将两者分开。
大多数优秀的开发人员应该能够在几天的调整时间内在两者之间转换。
我的核心挫败感在于我写了数百次:
String lastName as String
想知道为什么它永远不会编译!
【讨论】:
在 C# 中,您可以对事件/委托进行更精细的控制。但你很少需要这个。
还有更多的 C# 代码示例。
在 VB.Net 中,使用后期绑定(很多)更容易。例如 COM 对象(在 C# 中,从 4.0 版开始)。
一旦我对 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,因此两者具有几乎相同的性能、功能、库和组件。反射可以将 MSIL 代码反汇编为 C# 或 VB.NET(或许多其他语言)
这基本上给我们留下了,C# 看起来很像 Java 和 C++,这使它更具可信度。
【讨论】:
我认为 Josh 对语言差异做了很好的总结。
工具支持
然而,Visual Studio 处理这些语言的方式也存在差异。 代码片段在 C# 编辑器中更易于使用,重构也更好。
VB 编辑器通过不始终显示所有选项来简化智能感知。
我确信还有更多的东西,但那些是我作为 C#'er(很少做 VB)注意到的。
【讨论】:
这里还有一点尚未在这条线索中涉及:
更高的就业能力 + 更好(更多)的开发资源
现在我不同意这个观点:
VB 商店有更多的 C# 开发商店
如果您使用 VB 更强大,一些落后的 c# 雇主会让您处于严重的劣势。所以也许 C# 是这里更好的选择。
另一方面,当您为 C# 项目招聘人员时,您将能够吸引更多候选人参加 iterview,从而获得更好的技能——我认为不应忽视细节。
【讨论】:
我不得不说,在使用 Google 搜索示例或文档时,我的经验是 C# 示例的质量优于 VB 示例。这并不是说没有糟糕的 C# 示例,但如果您搜索“字典下拉菜单”之类的内容,添加 C# 将提供更高质量的答案。
这不适用于同时显示 C# 和 VB 代码的示例。
【讨论】:
目前 VB.Net 对 lambda 表达式的实现很差。这意味着你不能做你在 C# 中可以做的整洁的事情。好吧,你可以,但在大多数情况下,它需要一个非常难看的解决方法。
这已在 VB.Net 10.0 中解决。
【讨论】:
摆脱了旧的繁琐,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
【讨论】: