RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1025834
Accepted
Vladimr Vladimirovoch
Vladimr Vladimirovoch
Asked:2020-09-19 15:02:08 +0000 UTC2020-09-19 15:02:08 +0000 UTC 2020-09-19 15:02:08 +0000 UTC

Visual Studio 具有代码分析,它的用途以及在什么情况下使用它

  • 772

这个问题是理论上的。在studio里面有一个Analysis菜单的部分,这部分我只了解清除代码和Performance Profiler的功能,其实问题是如何使用代码分析以及它给出了什么。

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    MSDN.WhiteKnight
    2020-09-24T14:30:23Z2020-09-24T14:30:23Z

    需要进行代码分析以检查代码并识别可能的错误和违反其正确性和遵守最佳实践(例如,在架构或风格方面)的情况。在现代版本的工作室(2017+)中,分析器可以分为两组:

    • 源代码分析器。这些分析器实时工作,即使代码没有编译,也可以检查代码。您不需要专门启用它们,它们始终有效,并且与分析菜单无关。通常,它们的警告直接在代码编辑器中显示为工具提示,不太常见 - 在编译结果中。

    • 编译程序集的分析器。此类分析器仅在项目构建后启动,并检查二进制文件是否符合某些规则(主要通过架构),并在编译结果中显示警告。不适用于 .NET Core。分析菜单控制这些“旧”分析器。

    在什么情况下应该使用分析仪?第一种 - 显然总是,甚至不清楚如何禁用它们(有时它们会因错误而崩溃,在窗口的上部显示一条消息,并且分析会自行停止工作)。第二种类型 - 取决于项目的要求。例如,如果您正在创建一个其他人将使用的库,但如果只是为您自己准备的程序,那么使用它们是有意义的 - 很可能不会。

    使用源代码分析

    标准代码分析器主要从语言的角度检查代码的正确性,命名标识符的规则,也可以显示一些语法元素的简化建议。

    创建一个 C# 项目并向其中添加以下代码:

    using System;
    using System.IO;
    
    namespace NetCoreTest
    {
        class Program
        {        
            public class foo
            {
                 
            }
    
            static void Main(string[] args)
            {            
                Console.WriteLine("Hello World!");
                Console.ReadKey();
            }
        }
    }
    

    Studio 会在以小写字母命名的类加上虚线下划线,并在错误列表中显示代码为 IDE1006 的消息。(以 IDE 开头的代码是样式。)如果您将鼠标悬停在虚线上,则会出现一个工具提示,允许您选择建议的修复。

    此外,工作室以灰色突出显示未使用的 using 指令。此警告默认不会出现在错误列表中,但它也有代码(IDE0005)。同样,您可以将鼠标悬停在上方并应用修复以删除未使用的指令。

    来源分析

    修复后:

    using System;
    
    namespace NetCoreTest
    {
        class Program
        {        
            public class Foo
            {
                 
            }
    
            static void Main(string[] args)
            {            
                Console.WriteLine("Hello World!");
                Console.ReadKey();
            }
        }
    }
    

    您可以安装额外的分析器来检查架构(它们有以“CA”开头的警告代码)。有关详细信息,请参阅安装 .NET 编译器平台代码分析器。

    使用编译的汇编分析器

    让我们创建一个 .NET Framework 项目并向其中添加代码:

    using System;
    
    namespace ConsoleApplication1
    {
        public class Program
        {
            public class Foo { }
    
            static void Main(string[] argv)
            {
                Console.WriteLine("Hello world");
                Console.ReadKey();
            }  
        }
    }
    

    让我们转到项目属性,在“代码分析”选项卡上,选中“在程序集中启用代码分析”框并选择“Microsoft 基本设计指南和规则”(BasicDesignGuidelineRules.ruleset)规则集,或者类似的更严格的规则集。让我们构建项目。结果:

    装配分析

    让我们看一下警告:

    CA1014:Microsoft.Design:将“ConsoleApp1.exe”标记为 CLSCompliant(true),因为它公开了外部可见的类型。

    包含公共类型的程序集必须标记为符合 CLS 规范。既然我们不是在写库,而是在写程序,那么里面就不应该有开放类型(单元测试的便利暂时不考虑),所以不通过添加属性来修复它是合乎逻辑的,而是通过从 Program 类中删除 public 。

    CA1053:Microsoft.Design:因为“程序”类型仅包含静态成员,请将其标记为静态,这样编译器就不会添加通用默认构造函数。

    到这里一切都清楚了,Program类没有实例成员,所以它必须是静态的。

    CA1801:Microsoft.Usage:从未使用过“Program.Main(string[])”中的“argv”参数。删除此参数或在方法体中使用它。

    这与架构没有直接关系,环境会警告我们有一个未使用的参数可以删除以简化代码。

    CA1034:Microsoft.Design:不要嵌套“Program.Foo”类型。相反,将访问模式更改为它,使其从外部看不到。

    请参阅公共嵌套类 - 不好的做法?


    对于这种类型的分析仪,您需要手动更正它。我们在修复了这些警告后得到了这段代码(它实际上输出了一个关于未使用的 Foo 类的新代码):

    using System;
    
    namespace ConsoleApplication1
    {
        static class Program
        {
            class Foo { }
    
            static void Main()
            {
                Console.WriteLine("Hello world");
                Console.ReadKey();
            }  
        }
    }
    

    到目前为止,我们还没有触及分析菜单。为什么需要它?“执行代码分析”项目似乎是为那些在构建期间不会自动执行的项目类型设计的。对于 C#,它是无用的。“执行代码分析并抑制活动错误”允许您将所有当前错误标记为已忽略,以防我们不修复它们。“配置代码分析”只是打开类似项目属性页面的另一个选项。“计算代码指标” - 计算代码的一些量化指标,包括项目和类级别。实用价值值得怀疑,但至少可以快速统计代码行数。

    代码分析文档

    • 8

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5