【问题标题】:Any reason why C#/VS doesn't have an auto-build feature like Java/Eclipse?为什么 C#/VS 没有像 Java/Eclipse 这样的自动构建功能?
【发布时间】:2025-12-30 02:15:09
【问题描述】:

我是一名 C#/.Net 开发人员,刚开始为 Android 开发 Java,使用 Eclipse 我注意到它可以随时编译,因此您无需等待程序构建。这看起来很神奇,除非发生了我不明白的事情。

我想知道为什么 C# 和 Visual Studio IDE 不提供此功能?有什么原因吗?

【问题讨论】:

    标签: c# java compiler-construction


    【解决方案1】:

    这实际上与 Java 没有任何关系。它更像是 Eclipse 的一个特性。特别是,增量后台编译是所有 Smalltalk IDE 至少从 1978 年左右开始的标准功能,甚至比 Lisp IDE 中的时间更长。

    Eclipse最初是一个 Smalltalk IDE,用 Smalltalk 编写,至今仍由 IBM 的 Smalltalk 部门维护。因此,当 IBM 的 Smalltalk 部门开发自己的 Java 编译器时,他们很自然地将其编写为增量和可重入的,就像他们的 Smalltalk 编译器一样。而这个名为 Jikes 的编译器与 Eclipse 一起开源,并成为支持所有增量动态编译的 ecj(Java 的 Eclipse 编译器), Eclipse JDT 的语法高亮、代码完成、类型推断和重构功能。

    绝对没有理由不能让 C# 也能做到这一点。它不起作用的原因是编译器不支持它,特别是编译器不是增量的。但这并不是 .NET 或 C# 或 Visual Studio 的固有限制,而是 C# 编译器维护者的想象力限制:传统上,微软的所有编译器都是由 C++ 编译器团队用 C++ 编写的,而那些人根本就没有听说过增量编译。不是因为他们愚蠢,而是因为在 C++ 社区中没有人关心这一点。

    但是,例如,VB 社区确实关心这些东西,因为他们已经习惯了 VB Classic。因此,VB.NET 编译器实际上支持增量构建、编辑并继续、IntelliSense、类型推断和重构。

    当然,C# 插件也支持很多这样的东西,但他们不使用实际的 C# 编译器来执行此操作。相反,他们基本上必须重新实现一半的编译器才能让 Visual Studio 插件工作,但他们没有实现实际的代码生成后端,所以虽然作为插件一部分的“编译器”可以 进行增量解析、语法突出显示、重构和编辑并继续,它不能实际上,你知道,编译

    然而,C# 的情况将发生变化:编译器的责任已重新分配给各自的语言团队,而 C# 团队目前正在重新实现编译器in C# 和 C# 团队中。这种重写的一个经常被谈论的结果将是编译器即服务特性,它允许您即时编译 C# 和/或表达式树的小型 sn-ps,例如还经常展示 C# REPL 和 C# 脚本功能。

    鉴于为了使 REPL 工作,编译器需要能够编译小的单个 sn-ps 代码无论如何并且新编译器应该是要在 Visual Studio C# 插件中使用来替换当前一堆 IntelliSense 和语法高亮 hack,在 Visual Studio 中进行增量编译应该不会太难。

    【讨论】:

    【解决方案2】:

    在 Java 中,每个类都被编译成一个单独的类文件,因此每次保存时都可以很容易地编译小单元代码。在 .net 中,您将一堆类编译到一个 DLL 中,这比较慢并且在编译过程中需要更多的逻辑。

    顺便说一句,这不是语言功能,而是 IDE 功能。并不是所有的 java IDE 都会自动编译,如果你愿意,你也可以在 eclipse 中禁用它。而且我确信 Visual Studio 有自动构建工具..

    【讨论】:

    • 另外,java 不需要链接运行时库,我认为 C# 需要链接(但我不是 C# 专家)
    • Resharper 是一个很好的自动构建工具,它不会真正构建,但它可以在构建之前检查您的项目是否存在错误,从而节省宝贵的时间。
    • 别忘了,VB 确实有这个功能。 C# 没有,也不是 C# 开发人员的流行请求。 IDE 会随时解析,这足以捕获大多数错误。此外,IDE 会缓存以前的构建,并且只需要在之后的后续构建中重建更改的内容。一般而言,在进行过程中完全编译 C# 会拖累性能,但不会增加太多附加值。
    • 感谢您的帮助。 Jorg 提供了一个非常彻底的答案,所以我想我最好将他标记为答案。
    【解决方案3】:

    Resharper 为 VS 提供插件会给你即时编译错误,但不会自动生成器

    【讨论】:

      【解决方案4】:

      自动构建除了最微不足道的应用程序之外的任何应用程序都会导致大量延迟,因为它会在您每次按下某个键时进行编译和链接。

      VS 确实具有智能感知和大量动态语法和健全性检查,这为您提供了自动构建的大部分优势而不会出现延迟。 (话说它在VS2010中似乎很烦人……)

      【讨论】:

        【解决方案5】:

        我知道,它不是自动生成器,但使用telerikJustCode 是一种产品,它通过提供解决方案范围的代码分析,远远超出了VS 动态语法检查。我不认为我是世界上唯一一个使用尝试构建来检查我是否包含了构建代码所需的所有东西的开发人员。使用 JustCode,您可以在此类事情上获得大量视觉帮助,而无需等待编译器告诉您您遗漏了什么。

        【讨论】:

          最近更新 更多