【问题标题】:C#'s edge over VB [closed]C# 在 VB 上的优势 [关闭]
【发布时间】:2018-08-08 18:06:37
【问题描述】:

C#.NET 中的什么使它比 VB.NET 更适合某些项目?

性能?、能力?、库/组件?、声誉?、可靠性?可维护性?,容易吗?


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

【问题讨论】:

    标签: c# .net vb.net


    【解决方案1】:

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

    1. C# 可以调用不安全的代码
    2. VB 有可选参数(来自 C#4.0)
    3. VB 在进行后期绑定调用时更易于使用(来自 C# 4.0)这和数字使 2 使用 VB 进行办公自动化更加清洁。
    4. VB 有一堆“帮助”函数和类,比如 My 命名空间;但是,C# 可以访问所有这些内容
    5. 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 世界中以不同的方式处理异常,您可以定义一段代码来处理多种类型的异常。

    编辑

    还有一些区别。

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

    c# if (foo is FooObject){}

    vb If TypeOf foo is FooObject then

    1. 正如 cmets 中所提到的,我希望我能看到他们给你荣誉,但 C# 没有类似的参数。您需要使用 RegEx 类。

    【讨论】:

    • Woot,终于 C# 获得了可选参数?关于该死的时间!大声笑:D
    • 不开玩笑,我不必查看具有 30 个构造函数的类,涵盖所有可能的参数排列
    • 你确定VB不区分大小写吗?我认为只是 Visual Studio 为您修复了变量和方法的大小写。
    • 我是凭记忆做的,现在是凌晨 2:30,所以可能是错的,让我用谷歌搜索一下
    • @Josh re carpal tunnel: Intellisense 和 AutoComplete 在 VS2008 VB IDE 中非常好,如果你做对了,最终块语句的实际输入几乎为零 - 它把它们都放进去了.此外,IMO 可读性更好,因为端块不同,而不仅仅是嵌套的 }s
    【解决方案2】:

    我认为 Kathleen Dollard 的这篇博文很好地概述了这个问题:

    What a C# Coder Should Know Before They Write VB

    她的第一个建议是:

    1) 克服尊重或退出 在你开始之前。 VB是个好东西 语言。

    【讨论】:

    • +1 很棒的链接!谢谢,我更喜欢 C#,是时候多学习一点 VB.NET。
    • 我喜欢我的 VB.NET。这是一个很棒的帖子。 +1
    • +1 - 很棒的帖子,但讨厌她网站的配色方案(没关系)...
    【解决方案3】:

    极客中的街头信誉。

    (不要假装这不重要!)

    【讨论】:

    • 来吧,如果一个理性的程序员真的只是想把工作做好,他应该关心一些“街头信誉”。现在,如果项目经理喜欢 C#,那就另当别论了 :)
    • 当我从 C# 转到 VB 时,我不禁觉得自己失去了一些编码能力。
    【解决方案4】:

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

    VB9 有:

    • XML 文字
    • 可变匿名类型 (urgh)
    • 语言提供更多 LINQ 支持(C# 仅涵盖少数运算符)
    • 语言中的一大堆额外位被编译为对 Microsoft.VisualBasic 程序集的调用。 (C# 更喜欢成为一种小型语言,其背后有 .NET 框架的重要性。)
    • 日期时间文字

    C# 3 有:

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

    我怀疑还有更多,但我想我会把它们混在一起。

    【讨论】:

    • Microsoft.VisualBasic 程序集是 .NET 框架的一部分,许多 C# 程序都使用它。
    • 添加:C# 适用于不支持 VB 的平台,例如 XNA/XBox 360。
    • VB10 lambdas 支持块(多行)。这是用于函数和子的。
    【解决方案5】:

    当您遇到问题时,您通常可以在 Google 上找到一个代码示例,展示如何在几分钟内解决问题。这是提高生产力的一个重要因素。当我使用 Delphi 时,我必须将代码示例从 C 转换为 Object Pascal——可行,但很乏味,即有很多摩擦。所以不要小看...

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

    【讨论】:

    • 真实而重要,这就是为什么每个 VB 程序员都应该了解 C# 的原因——反之亦然。
    • @Mike & Konrad - 我同意! VBC# 很重要。我想知道他们为什么不一起教他们,因为他们无论如何都很相似。
    • @Konrad:因为我的开发经理是 VB 编码员,所以我不得不做大量的 VB-to-C#-to-VB。能够来回走动肯定会有所帮助。
    【解决方案6】:

    在VB.NET的早期版本中,差异比较明显,但在当前版本中,没有显着差异。

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

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

    【讨论】:

    • 代码中的 XML 文字是一个可怕的想法,也是对语言 IMO 的厌恶。我从来都不是 VB 的粉丝,但这几乎可以达成交易。此外,包装单行语句的整个 _ 是非常不必要的。
    • _ 不是不必要的。它使“;”在你的“编程线”结束时过时在 99% 的时间里你不需要一个 _
    • 我同意 Chris,特别是今天,使用 LINQ,使用 _ 看起来真的很脏
    • '_' 上同上,但我认为 XML 文字是个好主意。
    • Chris...你真的在 VB .NET 中使用过 XML 文本吗?
    【解决方案7】:

    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

    【讨论】:

    • 这是 Visual Studio 默认设置的问题,而不是 VB.net 语言。这可以删除。
    【解决方案8】:

    我最喜欢的 C# 没有 VB 的特性是 yield 语句。它使您可以轻松地从方法返回一个惰性求值的 IEnumerable。

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

    【讨论】:

      【解决方案9】:

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

      【讨论】:

      • 是的。我对 C# 作为一门语言没有宗教上的反对意见——我主要使用 VB.NET,但是当我需要 C# 时它就可以了。但是 VB IDE 的预编译/智能感知/自动完成系统要好得多。今年早些时候我在合同中使用 C# 时,使用 VS2008 C# IDE 就像回到了 5 年前。
      • 使用 ReSharper 这不是问题。我现在不能没有它。
      • 奇怪...这就是我在做 VB 时的感觉...(回溯 5 年)(我们可能错过了我们在日常工作中认为理所当然的不同功能...)
      • 编辑时编译实际上是大型项目的一个问题,因为它会显着降低 IDE 性能。
      • @Jeremy - 我从来没有注意到,我在 VB.Net 中有一个 700000 Loc 项目。
      【解决方案10】:

      我看到 C# 的最大优势是绝大多数开源项目、示例代码和博客 sn-ps 都是用 C# 编写的。尽管使用工具(或您的头脑)很容易将这些转换为 VB.NET,但对于 VB 开发人员(如我)来说仍然是一项单调的任务。

      即使您每天使用 VB.NET 编写代码,您仍然需要能够阅读 C#

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

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

      我的核心挫败感在于我写了数百次:

      String lastName as String
      

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

      【讨论】:

      • 这很痛苦,但 C# 才是王道。我讨厌分号错误和区分大小写。我认为 VB 的冗长使它更具可读性。
      【解决方案11】:

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

      还有更多的 C# 代码示例。

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

      • 我的项目中有 90% 使用 C#
      • 我使用 VB.Net 与 Excel 等进行互操作

      一旦我对 F# 有了更深入的了解,我可能会将它用于 F# 更适合的部分。

      【讨论】:

        【解决方案12】:

        性能?

        没有区别,尽管 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 更容易,但这可能是有偏见的,无论如何,它只是微不足道的。

        【讨论】:

          【解决方案13】:

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

          虽然我个人更喜欢 C# 的简洁语法。 :)

          【讨论】:

          • 如果你喜欢简洁,试试 F#。它让 C# 看起来像一个啰嗦的历史教授
          • 阅读VB代码就像你的朋友在和你说话!只是将所有的“{”替换为“Then”!没什么大不了的。
          【解决方案14】:

          由于 C# 和 VB.Net 都编译为 MSIL,因此两者具有几乎相同的性能、功能、库和组件。反射可以将 MSIL 代码反汇编为 C# 或 VB.NET(或许多其他语言)

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

          【讨论】:

          • “可信度”?在什么意义上?
          • @Jeremy Rudd “可信度”,因为有大量程序员认为,如果一种语言没有大括号和分号,那么它一定是一种“玩具”语言.如果你不能说,我不同意。
          • 我会在“可信度”之前说“舒适”。使用 C#,我无需费力地从 C++ 跳到 JScript 再到 C#,甚至跳到 Perl,您可以用类似的方式编写。
          • @James:仅仅因为它们编译为 IL 并不意味着它们与您暗示的一样等价。这就像说 C# 2.0 和 C# 3.0 是一样的——添加的只是语法糖,但它是非常重要语法糖。
          • @Mark:哇。如果是否有牙套让你的大脑结结巴巴,那么你的语言太相似了。而且你的 Perl 很可能不是 Perl(因此:质量很差)。
          【解决方案15】:

          我认为 Josh 对语言差异做了很好的总结。

          工具支持

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

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

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

          【讨论】:

            【解决方案16】:

            这里还有一点尚未在这条线索中涉及:

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

            现在我不同意这个观点:

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

            如果您使用 VB 更强大,一些落后的 c# 雇主会让您处于严重的劣势。所以也许 C# 是这里更好的选择。

            另一方面,当您为 C# 项目招聘人员时,您将能够吸引更多候选人参加 iterview,从而获得更好的技能——我认为不应忽视细节。

            【讨论】:

              【解决方案17】:

              我不得不说,在使用 Google 搜索示例或文档时,我的经验是 C# 示例的质量优于 VB 示例。这并不是说没有糟糕的 C# 示例,但如果您搜索“字典下拉菜单”之类的内容,添加 C# 将提供更高质量的答案。

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

              【讨论】:

                【解决方案18】:

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

                这已在 VB.Net 10.0 中解决。

                【讨论】:

                  【解决方案19】:

                  摆脱了旧的繁琐,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

                  【讨论】:

                  • 不,数组声明不是“用额外的元素填充的”。它只是改变了声明的含义。而不是“声明这么多元素”,您正在编写“声明一个直到最后一个元素的数组”。与“填充”不同,尽管它可能同样令人困惑....
                  猜你喜欢
                  • 2014-01-19
                  • 2015-05-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-02-27
                  • 2013-05-15
                  • 2016-12-10
                  • 1970-01-01
                  相关资源
                  最近更新 更多