为什么与VB.NET相比,C#的IntelliSense支持不足?

6

在我看来,Java生态系统的开发为我赚到了许多钱。然而,几年来,我一直主要从事.Net领域的工作。最初,我进入.Net世界的过渡是编写和维护VB .Net代码。 Visual Studio(VS)提供了几乎所有我期望的Eclipse / Java组合多年工作后的良好智能提示支持。最终,我的雇主决定使用C#进行新的开发。对于C#的智能提示支持,我的初步印象不是很好。有时候,似乎VS没有针对C#的后台编译器,但偶尔会做出一些聪明的事情,表明有一些后台处理,但还不足以真正提高生产力。是否有任何合理的技术原因导致这两种语言之间的智能提示支持差异?


2
我发现的唯一问题是C#是大小写敏感的语言,所以有时我无法正确触发它。你能否举个例子说明你的意思? - Eric
2
VB.NET 从一开始就具备背景编译的功能。 - dr. evil
1
C#的Intellisense在源代码编辑之后甚至在构建/重新编译之前就会更新,这就是为什么我想知道OP的机器是否因某种原因而变慢。 - ChrisW
我觉得新标题更清晰易懂。 - Richard Berg
1个回答

14
有一段时间,C#和VB之间存在差距。VB会为您生成大量代码。例如,在完成“if”语句后按Enter键,如果您忘记了在该行末尾添加“Then”,则VB将自动添加它,并用“End If”部分关闭它。在C#中,您需要自己添加这些起始和结束的{}花括号。
在C#之前,VB就已经有了后台编译。实际上,这是使用ReSharper的主要吸引因素之一,提供了这种功能。但是,从VS 2008 / .NET 3.5 SP1开始,所有这些都发生了改变。您可以阅读Scott Gu的帖子here,但我将粘贴相关部分:
“C#代码编辑器现在识别并显示许多语义代码问题的红色波浪线错误,而以前需要显式编译才能识别。例如,如果您尝试在C#代码编辑器中声明和使用未知类型,则在进行构建之前不会看到编译错误。现在,使用SP1,您将立即看到实时红色波浪线错误(无需显式编译)。”
使用CodeRush或ReSharper绝对可以增强体验,自动完成常见语句,使VB开发人员感觉像是进行了无缝过渡。

虽然这并没有完全解决技术问题,但开发团队是不同的,也没有必要做相同的事情。换句话说,可能不会有共享的方法。这篇博客文章摘录自VB团队的技术负责人,支持这一点:

“后台编译”是VB中的功能,可以在您输入时为您提供完整的错误集。那些在VB和C#之间来回移动的人会注意到这一点,但仅使用VB的开发人员可能没有意识到其他语言(如C#)并不总是为您提供100%准确的智能感知,并且不总是为您提供所有存在于代码中的错误。这是因为它们的Intellisense引擎是单独的、缩小版的编译器,并没有在后台进行完整的编译。而VB则会在Visual Studio空闲时从头到尾编译您的整个项目,使我们能够立即填充任务列表并提供完全准确的错误,并使我们能够为您提供完全准确的Intellisense。

最后一点是最近的Channel9采访,采访了C#/VB/F#团队的PM Luca Bolognese,他强调这些语言不再朝着不同方向发展,而是开始分享它们的相似之处。因此看起来未来有很多好事情!


1
我的大脑某些平凡的区域里有一个小声音在说这是个坏主意。为什么?因为这些语言不相似是基于实用原因。它们应该被允许独立发展。 - Todd Stout
我必须承认,我还没有完全阅读这个答案,但第一段似乎并不完全准确。您提到的基本上听起来像VB中If语句的代码片段 - C#也有类似的片段:键入“if”并按Tab键生成整个块。还有许多其他类似的片段。 - Ryan Versaw
1
遗憾的是,我怀疑这是 VB.Net 的丧钟。微软正在将其降为二三流的地位。我是一个老派的 C/C++/Java/C#(和 Unix 人),但在使用 VB.Net 后,我意识到它是一种非常好的语言,在编程社区中却有着不应该存在的负面声誉。我会想念它的。 - Todd Stout
@Ryan:我熟悉代码片段,它们很有用,但正如你所说,你必须按Tab键才能生成它们。我的If Then示例不是那种片段,而是IDE在您按下正确组合后执行的操作(无需Tab),就像IDE在闭合括号/分号后重新格式化C#代码一样。VB可以处理这个问题,而我则更喜欢使用CTRL+K+D。我想象一下,一个VB开发人员转到C#后很快就会意识到VB为他们做了多少工作。例如:在If Then / End If之间进行的微不足道的代码封装可防止意外的单行语句;缺少C# {}可能会导致调试问题。 - Ahmad Mageed
1
@Todd:我两种语言都用过,但总体上更喜欢C#。你提到的负面情绪,据我所知,是来自VB6时代的。我在几个项目中使用了VB.NET,并对它有了一些健康的尊重(我的背景是C/C++/C#,没有VB6)。我真的不认为它会很快消失,或者C#将继承它的功能,然后微软就会关闭它。最近VB获得了XML文字量,而C# 2.0获得了yield。这些都是有用的功能。如果VB实现yield而不是让我为迭代器块编写自己的状态机,我会非常欢迎一些收敛。 - Ahmad Mageed
@Ahmad:我不能说我经常使用VB,所以我一直以为代码片段在它们之间的工作方式是相同的。谢谢你澄清了这一点! - Ryan Versaw

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