Visual Studio采用不同的方式来表达这些类型的警告,它取决于您正在编辑的语言(C#vs C++ vs VB.NET等)采用了什么技术。
- 语法验证。你的源代码有一个定义的语法。如果打开
{
,则语法定义知道文件中的某个位置必须有一个}
,因此这些简单检查纯粹在源代码结构上完成。
- 流程验证。你提到了return语句和null值问题,这些有点棘手。一旦源文件结构正确,就可以对AST进行简单的流分析,并确保结构中的每个分支都将生成一个return语句,或者确保变量在使用之前分配了一个值。
然后有一个更高级的验证类型可以发生,一个实际上需要在所有解析文件和/或它们的二进制表示的上下文中。 VB.NET例如雇用
- Background compilation。一旦语法和流程验证成功,这个过程将实际上尝试执行编译步骤。它在后台运行,并逐步尝试更新已编译的产品。如果遇到问题,会尽快将其标记出来。像Red-Gate .NET Demon这样的工具可以在Visual Studio中为其他语言添加类似的功能。就Intellisense/Editor而言,无论编译器是否将任何内容写入磁盘,或只是更新已编译产品的内存表示形式,都无关紧要。
然后有像Resharper和Code Rush这样的工具在内存中表示代码。 Visual Studio也构建了一个类似的模型,虽然在许多情况下不像这些IDE生产力工具那样富有功能
- 高级代码模型。与背景编译不完全或不直接(有时代码可能实际编译,但状态模型中的错误可能显示来自这些工具的红色小波),这些工具构建了代码的内存模型,并且可以使用非常先进的流验证在你的代码上标记各种问题。 Resharper和Code Rush都提供了一个SDK来扩展这些验证。 Visual Studio编译器和编辑器在某些时候会被替换为Project Roslyn,它提供了一个类似的SDK。
然后还有其的构建
期间加入
- 的MSBuild的信息。当您触发构建时,可能会触发大量自定义工具。例如,StyleCop和code Analysis提供了对正在编译的代码进行语言或二进制分析的工具。两者都可以通过附加规则进行扩展。 MsBuild将在编辑器中显示错误和警告,并且如果这些提供了文件名和行号,编辑器会愉快地在文本渲染中放置一个扭曲的字符。
Intellisense使用Visual Studio语言服务提供的数据以及VSPackages和MsBuild在编辑器中呈现文本。正如你所看到的,有多种方式可以收集这样的结果。 Visual Studio编辑器为文本提供了多个extensibility points which you can use to add your own smart tags and adornments。
此外,您还有许多提供类似功能的第三方工具。
Visual Studio的ASP.NET MVC editors或Visual Studio的Python插件是洞察这些工作方式的绝佳资源。
检查Roslyn框架是否由Microsoft工作,它在Syntax树上工作。 http://blogs.msdn.com/b/csharpfaq/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx – KuldipMCA 2014-10-07 11:51:26