什么是.Net代码分析器

https://docs.microsoft.com/zh-cn/visualstudio/code-quality/roslyn-analyzers-overview?view=vs-2022

https://github.com/dotnet/roslyn-analyzers

代码分析器 ( Code Analyzer ),在Visual Studio中,内置的 .NET Compiler Platform(Roslyn)分析器 会检查C#或Visual Basic代码的代码质量和代码样式问题。第一方.NET分析器与目标平台无关。即项目不需要面向特定的.NET平台。分析器适用于面向Net 5.0及早期.NET版本(如netcoreapp、net standard和net 472)的项目。

通过 代码质量分析 ( CAxxxx )规则,可在代码库中检查C#或Visual Basic代码的安全性、性能、设计及其他问题。

通过 代码样式分析 ( IDExxxx )规则,可在代码库中定义和维护一致的代码样式。

什么是Roslyn

https://github.com/dotnet/roslyn

Roslyn是.Net的编译平台。它由编译器本身和一组与编译器交互的强大api组成。

什么是Roslyn Analyzers

https://docs.microsoft.com/visualstudio/code-quality/roslyn-analyzers-overview

Roslyn分析器分析你的代码的风格,质量和可维护性,设计和其他问题。

https://docs.microsoft.com/visualstudio/code-quality/install-fxcop-analyzers

微软创建了一组名为 Microsoft.CodeAnalysis.FxCopAnalyzers 的分析器,它包含了静态代码分析中最重要的“FxCop”规则,并将其转换为Roslyn分析器。这些分析程序检查代码的安全性、性能和设计问题等。

https://docs.microsoft.com/zh-cn/visualstudio/code-quality/migrate-from-fxcop-analyzers-to-net-analyzers?view=vs-2019

.NET Compiler Platform(“Roslyn”)分析器 的源代码分析取代了 Microsoft.CodeAnalysis.FxCopAnalyzers 托管代码的传统分析。许多传统分析 (FxCop) 规则已被重新编写为源分析器。

https://docs.microsoft.com/zh-cn/dotnet/fundamentals/code-analysis/overview

在Visual Studio 2019 16.8和.NET 5.0的版本中 Microsoft.CodeAnalysis.NetAnalyzers 将被内置包含在.NET SDK中。

https://www.nuget.org/packages/Microsoft.CodeAnalysis.NetAnalyzers/

如果你不想升级到.NET 5 + SDK、具有非SDK样式的.NET Framework项目或更倾向于使用基于NuGet包的模型,则也可以在 Microsoft.CodeAnalysis.NetAnalyzers NuGet包中使用该分析器。

前置准备工作

新建示例解决方案"HelloNetAnalyzers"

https://github.com/TaylorShi/HelloNetAnalyzers

dotnet new sln -o HelloNetAnalyzers
cd .\HelloNetAnalyzers\

新建示例桌面项目"demoForWpfCoreNet3"

新建示例项目demoForWpfCoreNet3并加到解决方案中。

dotnet new wpf -o demoForWpfCoreNet3 -f netcoreapp3.0
dotnet sln add .\demoForWpfCoreNet3\demoForWpfCoreNet3.csproj

新建示例桌面项目"demoForWpfCoreNet5"

新建示例项目demoForWpfCoreNet5并加到解决方案中。

dotnet new wpf -o demoForWpfCoreNet5 -f net5.0
dotnet sln add .\demoForWpfCoreNet5\demoForWpfCoreNet5.csproj

新建示例桌面项目"demoForWpfCoreNet6"

新建示例项目demoForWpfCoreNet6并加到解决方案中。

dotnet new wpf -o demoForWpfCoreNet6 -f net6.0
dotnet sln add .\demoForWpfCoreNet6\demoForWpfCoreNet6.csproj

新建示例桌面项目"demoForWpfFrameNet4.5"

新建示例桌面项目"demoForWpfFrameNet4.7.2"

新建示例桌面项目"demoForWinformsFrameNet2.0"

新建示例桌面项目"demoForWinformsCoreNet3.0"

新建示例项目demoForWinformsCoreNet3.0并加到解决方案中。

dotnet new winforms -o demoForWinformsCoreNet3.0 -f netcoreapp3.0
dotnet sln add .\demoForWinformsCoreNet3.0\demoForWinformsCoreNet3.0.csproj

新建示例桌面项目"demoForWinformsCoreNet5.0"

新建示例项目demoForWinformsCoreNet5.0并加到解决方案中。

dotnet new winforms -o demoForWinformsCoreNet5.0 -f net5.0
dotnet sln add .\demoForWinformsCoreNet5.0\demoForWinformsCoreNet5.0.csproj

新建示例桌面项目"demoForWinformsCoreNet6.0"

新建示例项目demoForWinformsCoreNet6.0并加到解决方案中。

dotnet new winforms -o demoForWinformsCoreNet6.0 -f net6.0
dotnet sln add .\demoForWinformsCoreNet6.0\demoForWinformsCoreNet6.0.csproj

准备一段可供分析的代码

App.xaml.cs中,我们新增一个函数来供后续分析使用。

namespace demoForWpfCoreNet5
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
        int Add(int i1, int i2)
            return i1 + i2;

首先需要知道的是,这段代码运行是没有异常的。

.Net代码质量分析

.Net 5.0/6.0设置代码质量分析开启

a. .NET 5.0或更高版本的项目"默认启用"了代码分析

https://docs.microsoft.com/zh-cn/dotnet/fundamentals/code-analysis/overview#code-quality-analysis

从Visual Studio 2019 v16.8和.NET 5.0开始,这些分析器包含在.NET SDK中。分析功能针对面向.NET 5.0或更高版本的项目默认启用

b. 比.Net 5.0更早版本的默认是不启用代码分析

c. 手动控制是否启用代码质量分析

.NET 5.0或更高版本的项目,不管在启用还是禁用代码质量分析,都可以直接设置项目文件(*.csproj)中的PropertyGroup节点,新增EnableNETAnalyzers节点并且设置成TrueFalse

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <EnableNETAnalyzers>true</EnableNETAnalyzers>
  </PropertyGroup>
</Project>

d. .Net 5.0中默认启用的规则

在.Net 5中默认启用的规则如下:

https://www.nuget.org/packages/Microsoft.CodeAnalysis.NetAnalyzers

如果你还不想迁移到.Net 5.0/6.0,那么你可以通过Nuget包来安装并启用代码分析器。

a. .Net Core项目通过命令行安装Nuget包

dotnet add package Microsoft.CodeAnalysis.NetAnalyzers
<ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="6.0.0">
        <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        <PrivateAssets>all</PrivateAssets>
    </PackageReference>
</ItemGroup>

b. .Net Framework项目通过命令行安装Nuget包

在项目上右键选择"管理Nuget程序包",搜索关键词Microsoft.CodeAnalysis.NetAnalyzers检索Nuget包安装。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.CodeAnalysis.NetAnalyzers" version="6.0.0" targetFramework="net20" developmentDependency="true" />
</packages>
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.CodeAnalysis.NetAnalyzers" version="6.0.0" targetFramework="net45" developmentDependency="true" />
</packages>

.Net 5.0/6.0设置代码质量规则范围

从.Net 5.0开始,.Net SDK携带了所有的代码质量规则,但是通常情况下,只有一些规则作为生成警告启用,如果你希望自定义默认启用的一组规则,我们打开demoForWpfCoreNet5.csproj文件找到PropertyGroup节点,新增AnalysisMode节点并且设置成对应的模式值。

a. 通过AnalysisMode设置规则组模式

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <EnableNETAnalyzers>True</EnableNETAnalyzers>
    <AnalysisLevel>5.0</AnalysisLevel>
    <EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
  </PropertyGroup>
</Project>

b. 已知AnalysisMode清单

.NET 5和.NET 6中可用的选项值清单:

c. 根据类别来设定规则组模式

在.Net 6中还新增了一个AnalysisMode<Category>属性,使你能够在其他规则类别的不同级别启用或禁用规则。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <AnalysisMode>All</AnalysisMode>
    <AnalysisModeSecurity>Default</AnalysisModeSecurity>
  </PropertyGroup>
</Project>

d. 已知的AnalysisMode$Category类别清单

每个规则类别的属性名称清单:

.Net 5.0/6.0设置代码分析级别

a. 设置代码分析级别(AnalysisLevel)

如果你希望代码分析器根据.NET版本进行运行,我们打开demoForWpfCoreNet5.csproj文件找到PropertyGroup节点,新增AnalysisLevel节点并且设置成对应的清单值。

从.NET 5开始,每个.NET版本都有一组代码分析规则。在这组规则中,默认为该版本启用的规则将分析代码。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <EnableNETAnalyzers>true</EnableNETAnalyzers>
    <AnalysisLevel>latest</AnalysisLevel>
  </PropertyGroup>
</Project>

b. 已知分析级别清单(AnalysisLevel)

AnalysisLevel节点清单如下:

这里需要注意的是,对.Net 5.0的应用而言,给的默认值可能是5.0。

c. 设置指定类别的分析级别(AnalysisLevel$Category)

在.Net 6中还新增了一个AnalysisLevel<Category>属性,使你能够为特定类别使用不同版本的代码分析器,或在其他规则类别的不同级别启用或禁用规则。如果为特定规则类别省略此属性,则其默认为AnalysisLevel值。可用值与AnalysisLevel相同。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <AnalysisLevel>preview</AnalysisLevel>
    <AnalysisLevelSecurity>preview</AnalysisLevelSecurity>
  </PropertyGroup>
</Project>

d. 已知分析级别类别清单(AnalysisLevel$Category)

每个规则类别的属性名称清单如下:

通过Visual Studio启用代码分析并设置分析级别

其实也可以通过Visual Studio自带的可视化界面来设置,在Visual Studio中在当前demoForWpfCoreNet5项目上右键进入"属性"设置,可以找到"代码分析"-"所有分析器"-".Net分析器",完成分析器启用设置并且设置分析级别。

a. 在Visual Studio 2022中启用代码分析并设置分析级别

b. 在Visual Studio 2019中启用代码分析并设置分析级别

.Net 5.0/6.0设置规则严重级别

a. 已知配置规则的严重级别

已知的规则严重级别有:

严重性(解决方案资源管理器) 严重性(EditorConfig文件) 生成时行为 编辑器行为

b. 通过EditorConfig文件配置规则的严重级别

如果你希望这样的提示以更高级别的方式体现出来,比如是警告的提示,那么我们可以在这条信息上右键,直接设置它的set severity,比如这里我把它设置成Warning

我们会发现它会帮我们新建一个.editorconfig规则配置文件,在里面会具体指定某一条规则的警告级别,没错,这里正是帮我们把CA1822标记它的提示级别为警告。

[*.cs]
# CA1822: 将成员标记为 static
dotnet_diagnostic.CA1822.severity = warning

这时候重新编辑运行,我们看到它变成了叹号的警告状态了。

更近一步,我们还可以尝试把它的提示级别设置为错误,你会发现它将变成红色的错误提示,当然不用担心的事,这不会导致错误的运行,它仅仅是分析后给出的一个建议。

[*.cs]
# CA1822: 将成员标记为 static
dotnet_diagnostic.CA1822.severity = error

.Net 5.0/6.0将警告视为错误阻断生成或忽略

a. 在项目的生成设置中,我们可以设置将警告视为错误

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <TreatWarningsAsErrors>True</TreatWarningsAsErrors>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <TreatWarningsAsErrors>True</TreatWarningsAsErrors>
  </PropertyGroup>
</Project>

通常,这将强迫我们去解决所有的警告,以便继续生成项目。

b. 忽略所有的代码质量错误完成生成的手段

如果不希望将代码质量分析警告视为错误以中断你的生成,我们打开demoForWpfCoreNet5.csproj文件找到PropertyGroup节点,新增CodeAnalysisTreatWarningsAsErrors节点并且设置成False

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <EnableNETAnalyzers>true</EnableNETAnalyzers>
    <CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors>
  </PropertyGroup>
</Project>

这时候,即使已经开启了将警告视为错误设置,也不会影响项目生成。

.Net代码样式分析

.Net 5.0/6.0启用代码样式分析

https://docs.microsoft.com/zh-cn/dotnet/fundamentals/code-analysis/overview#code-style-analysis

a. 默认代码样式分析处于禁用

通过代码样式分析(IDExxxx)规则,可在代码库中定义和维护一致的代码样式。

对于所有.NET项目的版本,.NET代码样式分析默认处于禁用状态

b. 通过Visual Studio启用代码样式分析

通过Visual Studio项目属性设置中的代码分析设置项勾选"在生成时强制实施代码样式(实验性)"。

c. 通过项目配置文件启用代码样式分析

我们打开demoForWpfCoreNet5.csproj文件找到PropertyGroup节点,新增EnforceCodeStyleInBuild节点并且设置成True

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <AnalysisLevel>latest</AnalysisLevel>
    <EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
  </PropertyGroup>
</Project>

d. 通过EditorConfig文件配置规则的严重级别

实际上之前我们已经看到一个代码样式分析的提示,它是IDE0051,暂时它只是一个提示,如果你想提交它的严重等级,欧克,你可以直接右键设置它的严重等级。

它将生成或者在已有的.editorconfig规则配置文件中帮我们新增关于IDE0051的严重等级。

[*.cs]
# IDE0051: 删除未使用的私有成员
dotnet_diagnostic.IDE0051.severity = error

这时候重新编辑,你会看到,它编译不成功了,因为我们把这个样式检查的严重等级设置为错误等级。

.Net代码质量规则索引

https://docs.microsoft.com/zh-cn/dotnet/fundamentals/code-analysis/quality-rules/

.NET代码分析提供旨在提高代码质量的规则。这些规则分为设计、全球化、性能和安全性等领域。某些规则特定于.NET API用法,而其他规则与通用代码质量相关。

规则ID和警告 CA1000:不要在泛型类型中声明静态成员 调用泛型类型的静态成员时,必须指定该类型的类型参数。当调用不支持推理的泛型实例成员时,必须指定该成员的类型参数。在上述两种情况下,用于指定类型自变量的语法不同,但很容易混淆。 CA1001:具有可释放字段的类型应该是可释放的 一个类声明并实现System.IDisposable类型的实例字段,但该类不实现IDisposable。声明IDisposable字段的类间接拥有非托管资源,并且应该实现IDisposable接口。 CA1002:不要公开泛型列表 Collections.Generic.List<(Of<(T>)>)是针对性能(而非继承)设计的泛型集合。因此,List不包含任何虚拟成员。应改为公开针对继承设计的泛型集合。 CA1003:使用泛型事件处理程序实例 某个类型包含的委托返回void,该委托的签名包含两个参数(第一个参数是对象,第二个参数是可以分配给EventArgs的类型),而且包含程序集针对的是Microsoft.NETFramework 2.0。 CA1005:避免泛型类型的参数过多 泛型类型包含的类型参数越多,越难以知道并记住每个类型参数各代表什么。它通常有一个类型参数,如在List<T>中,而在某些情况下有两个类型参数,如在Dictionary<TKey,TValue>中。但是,如果存在两个以上的类型参数,则大多数用户都会感到过于困难。 CA1008:枚举应具有零值 像其他值类型一样,未初始化枚举的默认值为零。无标志特性的枚举应通过使用零值来定义成员,这样默认值即为该枚举的有效值。如果应用了FlagsAttribute特性的枚举定义值为零成员,则该成员的名称应为“None”,以指示枚举中尚未设置值。 CA1010:集合应实现泛型接口 若要扩大集合的用途,应实现某个泛型集合接口。然后,可以使用该集合来填充泛型集合类型。 CA1012:抽象类型不应具有构造函数 抽象类型的构造函数只能由派生类型调用。由于公共构造函数用于创建类型的实例,但无法为抽象类型创建实例,因此具有公共构造函数的抽象类在设计上是错误的。 CA1014:用CLSCompliantAttribute标记程序集 公共语言规范(CLS)定义了程序集在跨编程语言使用时必须符合的命名限制、数据类型和规则。好的设计要求所有程序集用CLSCompliantAttribute显式指示CLS合规性。如果程序集没有此特性,则该程序集即不合规。 CA1016:用AssemblyVersionAttribute标记程序集 .NET使用版本号来唯一标识程序集,并绑定到强名称程序集中的类型。版本号与版本和发行者策略一起使用。默认情况下,仅使用用于生成应用程序的程序集版本运行应用程序。 CA1017:用ComVisibleAttribute标记程序集 ComVisibleAttribute决定COM客户端如何访问托管代码。合理的设计指出程序集将显式指示COM可见性。可以设置整个程序集的COM可见性,然后重写各个类型和类型成员的COM可见性。如果此特性不存在,则程序集的内容对COM客户端可见。 CA1018:用AttributeUsageAttribute标记特性 当定义自定义特性时,用AttributeUsageAttribute标记该特性,以指示源代码中可以应用自定义特性的位置。特性的含义和预定用法将决定它在代码中的有效位置。 CA1019:定义特性参数的访问器 特性可以定义强制自变量,在对目标应用该特性时必须指定这些自变量。这些实参也称为位置实参,因为它们将作为位置形参提供给特性构造函数。对于每一个强制变量,特性还必须提供一个相应的只读属性,以便可以在执行时检索该变量的值。特性还可以定义可选实参,可选实参也称为命名实参。这些变量按名称提供给特性构造函数,并且必须具有相应的读/写属性。 CA1021:避免使用out参数 通过引用(使用out或ref)传递类型要求具有使用指针的经验,了解值类型和引用类型的不同之处,以及能处理具有多个返回值的方法。另外,out和ref参数之间的差异没有得到广泛了解。 CA1024:在适用处使用属性 公共或受保护方法的名称以“Get”开头,没有采用任何参数或返回的值不是数组。该方法可能很适于成为属性。 CA1027:用FlagsAttribute标记枚举 枚举是一种值类型,它定义一组相关的已命名常数。如果可以按照有意义的方式组合一个枚举的已命名常数,则对该枚举应用FlagsAttribute。 CA1028:枚举存储应为Int32 枚举是一种值类型,它定义一组相关的已命名常数。默认情况下,System.Int32数据类型用于存储常量值。尽管您可以更改此基础类型,然而对于大多数情况,既不需要,也不建议您这样做。 CA1030:在适用处使用事件 该规则检测名称通常用于事件的方法。如果为响应明确定义的状态更改而调用一个方法,则应由事件处理程序调用该方法。调用该方法的对象应引发事件而不是直接调用该方法。 CA1031:不要捕捉一般异常类型 不应捕捉一般异常。捕捉更具体的异常,或者在执行catch块中的最后一条语句时重新引发一般异常。 CA1032:实现标准异常构造函数 如果不能提供完整的构造函数集,要正确处理异常将变得比较困难。 CA1033:接口方法应可由子类型调用 未密封的外部可见类型提供了显式实现公共接口的方法,但没有提供具有相同名称的其他外部可见方法。 CA1034:嵌套类型不应是可见的 嵌套类型是在另一个类型的范围中声明的类型。嵌套类型用于封装包含类型的私有实现详细信息。如果用于此用途,则嵌套类型不应是外部可见的。 CA1036:重写可比较类型中的方法 公共或受保护类型实现System.IComparable接口。它不重写Object.Equals,也不重载表示相等、不等、小于或大于的语言特定运算符。 CA1040:避免使用空接口 接口定义提供某个行为或使用协定的成员。接口所描述的功能可以被任何类型采用,而不管该类型出现在继承层次结构中的哪个位置。类型通过实现接口的成员来实现接口。空接口无法定义任何成员;因此,它无法定义可以实现的协定。 CA1041:提供ObsoleteAttribute消息 用未指定其ObsoleteAttribute.Message属性的System.ObsoleteAttribute特性来标记类型或成员。当编译用ObsoleteAttribute标记的类型或成员时,将显示该特性的Message属性。这将为用户提供有关已过时的类型或成员的信息。 CA1043:将整型或字符串参数用于索引器 索引器(即索引属性)应将整型或字符串类型用于索引。这些类型一般用于为数据结构编制索引,并且提高库的可用性。应仅限于在设计时无法指定特定整型或字符串类型的情况下使用Object类型。 CA1044:属性不应是只写的 虽然可以接受且经常需要使用只读属性,但设计准则禁止使用只写属性。这是因为允许用户设置值但又禁止该用户查看这个值不能提供任何安全性。而且,如果没有读访问,将无法查看共享对象的状态,使其用处受到限制。 CA1045:不要通过引用来传递类型 通过引用(使用out或ref)传递类型要求具有以下能力:使用指针的经验,了解值类型和引用类型的不同之处,以及能处理具有多个返回值的方法。为一般用户进行设计的库架构师不应指望用户能熟练运用out或ref参数。 CA1046:不要对引用类型重载相等运算符 对于引用类型,相等运算符的默认实现几乎始终是正确的。默认情况下,仅当两个引用指向同一对象时,它们才相等。 CA1047:不要在密封类型中声明受保护的成员 类型声明受保护的成员,使继承类型可以访问或重写该成员。按照定义,不能继承密封类型,这表示不能调用密封类型上的受保护方法。 CA1050:在命名空间中声明类型 应在命名空间内声明类型以避免名称冲突,并作为一种在对象层次结构中组织相关类型的方式。 CA1051:不要声明可见实例字段 字段的主要用途应是作为实现的详细信息。字段应为private或internal,并应通过使用属性公开这些字段。 CA1052:应密封静态容器类型 公共或受保护类型仅包含静态成员,而且没有用sealed(C#参考)(Not Inheritable)修饰符声明该类型。应使用sealed修饰符标记不希望被继承的类型,以免将其用作基类型。 CA1053:静态容器类型不应具有构造函数 公共或嵌套公共类型只声明了静态成员,但具有公共或受保护的默认构造函数。由于调用静态成员不需要类型的示例,因此没必要使用构造函数。为安全起见,字符串重载应使用字符串自变量调用统一资源标识符(URI)重载。 CA1054:URI参数不应为字符串 如果某方法采用URI的字符串表示形式,则应提供采用URI类的实例的相应重载,该重载以安全的方式提供这些服务。 CA1055:URI返回值不应是字符串 此规则假定该方法返回URI。URI的字符串表示形式容易导致分析和编码错误,并且可造成安全漏洞。System.Uri类以一种安全的方式提供这些服务。 CA1056:URI属性不应是字符串 此规则假定属性表示统一资源标识符(URI)。URI的字符串表示形式容易导致分析和编码错误,并且可造成安全漏洞。System.Uri类以一种安全的方式提供这些服务。 CA1058:类型不应扩展某些基类型 外部可见的类型扩展某些基类型。请使用某个备选项。 CA1060:将P/Invoke移动到NativeMethods类 平台调用方法(例如标以System.Runtime.InteropServices.DllImportAttribute特性的那些方法,或在VisualBasic中使用Declare关键字定义的方法)可以访问非托管代码。这些方法应属于NativeMethods、SafeNativeMethods或UnsafeNativeMethods类。 CA1061:不要隐藏基类方法 如果派生方法的参数签名只是在类型方面有所不同,而且与基方法的参数签名中的对应类型相比,这些类型的派生方式更弱,则基类型中的方法由派生类型中的同名方法隐藏。 CA1062:验证公共方法的参数 对于传递给外部可见方法的所有引用自变量,都应检查其是否为null。 CA1063:正确实现IDisposable 所有的IDisposable类型都应当正确实现Dispose模式。 CA1064:异常应该是公共的 内部异常仅在其自己的内部范围内可见。当异常超出内部范围后,只能使用基异常来捕获该异常。如果内部异常继承自Exception、SystemException或ApplicationException,则外部代码将没有足够的信息来了解如何处理该异常。 CA1065:不要在意外的位置引发异常 不应引发异常的方法引发了异常。 CA1066:重写Equals时实现IEquatable 值类型替代Equals方法,但不实现IEquatable<T>CA1067:实现IEquatable时重写Equals 类型实现IEquatable<T>,但不替代Equals方法。 CA1068:CancellationToken参数必须最后出现 方法具有CancellationToken参数,但它不是最后一个参数。 CA1069:枚举不得具有重复值 枚举具有多个成员,这些成员显式分配有相同常数值。 CA1070:不要将事件字段声明为“虚拟” 类字段事件被声明为“虚拟”。 CA1200:不要使用带前缀的cref标记 XML文档标记中的cref属性是指“代码引用”。它指定标记的内部文本是一个代码元素,例如类型、方法或属性。避免使用带有前缀的cref标记,因为它会阻止编译器验证引用。它还会阻止Visual Studio集成开发环境(IDE)在重构过程中查找和更新这些符号引用。 CA1303:请不要将文本作为本地化参数传递 某外部可见的方法将一个字符串字面量作为参数传递给.NET构造函数或方法,该字符串应该是可本地化的字符串。 CA1304:指定CultureInfo 某方法或构造函数调用的成员有一个接受System.Globalization.CultureInfo参数的重载,但该方法或构造函数没有调用接受CultureInfo参数的重载。如果未提供CultureInfoSystem.IFormatProvider对象,则重载成员提供的默认值可能不会在所有区域设置中产生您想要的效果。 CA1305:指定IFormatProvider 某方法或构造函数调用的一个或多个成员有接受System.IFormatProvider参数的重载,但该方法或构造函数没有调用接受IFormatProvider参数的重载。如果未提供System.Globalization.CultureInfo或IFormatProvider对象,则重载成员提供的默认值可能不会在所有区域设置中产生您想要的效果。 CA1307:为了清晰起见,请指定StringComparison 字符串比较运算使用不设置StringComparison参数的方法重载。 CA1308:将字符串规范化为大写 字符串应正常化为大写字母。少量字符转换为小写字母后不能再转换回来。 CA1309:使用按顺序的StringComparison 非语义的字符串比较运算不会将StringComparison参数设置为Ordinal或OrdinalIgnoreCase。因此,通过将参数显式设置为StringComparison.OrdinalStringComparison.OrdinalIgnoreCase,通常可以提高代码的速度、正确性和可靠性。 CA1310:为了确保正确,请指定StringComparison 字符串比较操作使用未设置StringComparison参数的方法重载,并默认使用区域性特定的字符串比较。 CA1401P/Invokes应为不可见 公共类型中的公共或受保护方法具有System.Runtime.InteropServices.DllImportAttribute属性(在VisualBasic中由Declare关键字实现)。这些方法不能公开。 CA1416:验证平台兼容性 在组件上使用依赖于平台的API会使代码无法用于所有平台。 CA1417:请勿对P/Invokes的字符串参数使用OutAttribute 如果该字符串为暂存的字符串,则通过包含OutAttribute的值传递的字符串参数可能使运行时变得不稳定。 CA1418:使用有效的平台字符串 平台兼容性分析器需要有效的平台名称和版本。 CA1501:避免过度继承 类型在继承层次结构中的深度超过四级。深度嵌套的类型层次结构可能很难遵循、理解和维护。 CA1502:避免过度复杂 此规则通过方法来测量线性独立的路径的数量,该数量是由条件分支的数量和复杂度决定的。 CA1505:避免使用无法维护的代码 类型或方法具有较低的可维护性索引值。如果可维护性指数较低,则表示类型或方法可能难以维护,最好重新进行设计。 CA1506:避免过度类耦合度 此规则通过计算类型或方法包含的唯一类型引用的个数来衡量类耦合。 CA1507:使用nameof代替字符串 字符串字面量用作参数,可在其中使用nameof表达式。 CA1508:避免死条件代码 方法具有在运行时始终计算为true或false的条件代码。这会导致条件的false分支中出现死代码。 CA1509:代码度量配置文件中的条目无效 代码度量规则(如CA1501、CA1502、CA1505和CA1506)提供了具有无效条目的名为CodeMetricsConfig.txt的配置文件。 CA1700:不要命名“Reserved”枚举值 此规则假定当前不使用名称中包含“reserved”的枚举成员,而是将其作为一个占位符,以在将来的版本中重命名或移除它。重命名或移除成员是一项重大更改。 CA1707:标识符不应包含下划线 按照约定,标识符名称不包含下划线(_)字符。该规则将检查命名空间、类型、成员和参数。 CA1708:标识符应以大小写之外的差别进行区分 不能仅通过大小写区分命名空间、类型、成员和参数的标识符,因为针对公共语言运行时的语言不需要区分大小写。 CA1710:标识符应具有正确的后缀 按照约定,扩展某些基类型或实现某些接口的类型的名称,或者由这些类型派生的类型的名称应具有与相应基类型或接口关联的后缀。 CA1711:标识符应采用正确的后缀 按照约定,只有扩展某些基类型或实现某些接口的类型的名称或者从这些类型派生的类型的名称,应该以特定的保留后缀结尾。其他类型名称不应使用这些保留的后缀。 CA1712:不要将类型名用作枚举值的前缀 枚举成员的名称不能使用类型名称作为前缀,因为类型信息将由开发工具提供。 CA1713:事件不应具有before或after前缀 事件的名称以“Before”或“After”开头。若要命名按特定顺序引发的相关事件,请使用现在时或过去时指示一系列操作中的相对位置。 CA1714:Flags枚举应采用复数形式的名称 公共枚举具有System.FlagsAttribute特性并且其名称不是以“s”结尾。用FlagsAttribute标记的类型具有复数形式的名称,因为该特性指明可以指定多个值。 CA1715:标识符应具有正确的前缀 外部可见的接口的名称不以大写的“I”开头。外部可见的类型或方法上的泛型类型参数的名称不以大写的“T”开头。 CA1716:标识符不应与关键字冲突 某个命名空间名称或类型名称与编程语言中的保留关键字相同。命名空间和类型的标识符不应与针对公共语言运行时的语言所定义的关键字冲突。 CA1717:只有FlagsAttribute枚举应采用复数形式的名称 命名约定规定,复数形式的枚举名称表示可以同时指定多个枚举值。 CA1720:标识符不应包含类型名称 外部可见成员中的某个参数的名称包含一个数据类型名称,或者外部可见成员的名称包含一个语言特定的数据类型名称。 CA1721:属性名不应与get方法冲突 公共或受保护成员的名称以“Get”开头,且其余部分与公共或受保护属性的名称匹配。“Get”方法和属性的名称应能够明确区分其功能上的差异。 CA1724:类型名不应与命名空间冲突 类型名不应与.NET命名空间的名称匹配。与该规则冲突将使库的可用性下降。 CA1725:参数名应与基方法中的声明保持一致 以一致的方式命名重写层次结构中的参数可以提高方法重写的可用性。如果派生方法中的参数名与基声明中的名称不同,可能会导致无法区分出该方法是基方法的重写还是该方法的新重载。 CA1801:检查未使用的参数 方法签名包含一个没有在方法体中使用的参数。 CA1802:在合适的位置使用文本 某个字段被声明为static和read-only(在VisualBasic中为Shared和ReadOnly),并使用可在编译时计算的值初始化。因为赋给目标字段的值可在编译时计算,因此请将声明更改为const(在VisualBasic中为Const)字段,以便在编译时而非运行时计算值。 CA1805:避免进行不必要的初始化 在运行构造函数之前,.NET运行时将引用类型的所有字段初始化为其默认值。在大多数情况下,将字段显式初始化为其默认值是多余的,这会增加维护成本,并可能会降低性能(例如随着程序集大小的增加)。 CA1806:不要忽略方法结果 创建一个新对象,但从不使用该对象;或者调用会创建并返回一个新字符串的方法,但从不使用这个新字符串;或者COM或P/Invoke方法返回一个从不使用的HRESULT或错误代码。 CA1810:以内联方式初始化引用类型的静态字段 当一个类型声明显式静态构造函数时,实时(JIT)编译器会向该类型的每个静态方法和实例构造函数中添加一项检查,以确保之前已调用该静态构造函数。静态构造函数检查会降低性能。 CA1812:避免未实例化的内部类 程序集级别类型的实例不是由程序集中的代码创建的。 CA1813:避免使用非密封特性 .NET提供用于检索自定义属性的方法。默认情况下,这些方法搜索特性继承层次结构。通过密封特性,将无需搜索继承层次结构,且能够提高性能。 CA1814:与多维数组相比,首选使用交错数组 交错数组是元素为数组的数组。构成元素的数组可以是不同的大小,以减少某些数据集的浪费空间。 CA1815:重写值类型上的Equals和相等运算符 对于值类型,Equals的继承的实现使用反射库,并比较所有字段的内容。反射需要消耗大量计算资源,可能没有必要比较每一个字段是否相等。如果希望用户对实例进行比较或排序,或者希望用户将实例用作哈希表键,则值类型应实现Equals。 CA1816:正确调用GC.SuppressFinalize 作为Dispose的实现的某个方法未调用GC.SuppressFinalize;或者不是Dispose的实现的某个方法调用了GC.SuppressFinalize;或者某个方法调用了GC.SuppressFinalize并传递this(在VisualBasic中是Me)以外的某个值。 CA1819:属性不应返回数组 即使属性是只读的,该属性返回的数组也不是写保护的。若要使数组不会被更改,属性必须返回数组的副本。通常,用户不能理解调用这种属性的负面性能影响。 CA1820:使用字符串长度测试是否有空字符串 使用String.Length属性或String.IsNullOrEmpty方法比较字符串要比使用Equals的速度快得多。 CA1821:移除空终结器 应尽可能避免终结器,因为跟踪对象生存期会产生额外的性能系统开销。空的终结器只会徒增系统开销,没有一点好处。 CA1822:将成员标记为static 可以将不访问实例数据或不调用实例方法的成员标记为static(在VisualBasic中为Shared)。在将这些方法标记为static之后,编译器将向这些成员发出非虚拟调用站点。这会使性能敏感的代码的性能得到显著提高。 CA1823:避免未使用的私有字段 检测到程序集内有似乎未访问过的私有字段。 CA1824:用NeutralResourcesLanguageAttribute标记程序集 NeutralResourcesLanguage特性通知资源管理器用于显示程序集的非特定区域性资源的语言。这将改进所加载的第一个资源的查找性能,并缩小工作集。 CA1825:避免数组分配长度为零 初始化长度为零的数组将导致不必要的内存分配。相反,请通过调用Array.Empty来使用静态分配的空数组实例。内存分配在此方法的所有调用之间共享。 CA1826:使用属性,而不是Linq Enumerable方法 对支持等效且更有效的属性的类型使用了Enumerable LINQ方法。 CA1827:如果可以使用Any,请勿使用Count/LongCount 在使用Any方法会更有效的情况下使用了Count或LongCount方法。 CA1828:如果可以使用AnyAsync,请勿使用CountAsync/LongCountAsync 在使用AnyAsync方法会更有效的情况下使用了CountAsync或LongCountAsync方法。 CA1829:使用Length/Count属性,而不是Enumerable.Count方法 对支持等效且更有效的Length或Count属性的类型使用了Count LINQ方法。 CA1830:在StringBuilder上优先使用强类型“追加和插入”方法重载 Append和Insert为除String之外的多种类型提供重载。如果可能,首选强类型重载,而非ToString()和基于字符串的重载。 CA1831:在合适的情况下,为字符串使用AsSpan而不是基于范围的索引器 对字符串使用范围索引器并向ReadOnlySpan<char>类型隐式赋值时,将使用方法Substring而非Slice,这会生成字符串请求部分的副本。 CA1832:使用AsSpan或AsMemory而不是基于范围的索引器来获取数组的ReadOnlySpan或ReadOnlyMemory部分 对字符串使用范围索引器并向ReadOnlySpan<T>ReadOnlyMemory<T>类型隐式赋值时,将使用方法GetSubArray而非Slice,这会生成数组请求部分的副本。 CA1833:使用AsSpan或AsMemory而不是基于范围的索引器来获取数组的Span或Memory部分 对字符串使用范围索引器并向Span<T>Memory<T>类型隐式赋值时,将使用方法GetSubArray而非Slice,这会生成数组请求部分的副本。 CA1834:对单字符字符串使用StringBuilder.Append(char) StringBuilder具有将char用作其参数的Append重载。优先选择调用char重载以提高性能。 CA1835:对于“ReadAsync”和“WriteAsync”,首选基于“Memory”的重载 “Stream”有一个将“Memory<byte>”用作第一个参数的“ReadAsync”重载和一个将“ReadOnlyMemory<Byte>”用作第一个参数的“WriteAsync”重载。优先选择调用基于内存的重载,它们更有效。 CA1836:如可用,首选IsEmpty而不是Count 首选比Count、Length、Count<TSource>(IEnumerable<TSource>)LongCount<TSource>(IEnumerable<TSource>)更有效的IsEmpty属性,以确定对象是否包含任何项目。 CA1837:使用Environment.ProcessId而不是Process.GetCurrentProcess().Id Environment.ProcessIdProcess.GetCurrentProcess().Id更简单、更快速。 CA1838:避免对P/Invokes使用StringBuilder参数 “StringBuilder”的封送处理总是会创建一个本机缓冲区副本,这导致一个封送处理操作出现多次分配。 CA1841:首选字典包含方法 对Keys或Values集合调用Contains通常比对字典本身调用ContainsKey或ContainsValue开销更高。 CA1844:对“流”进行子分类时,提供异步方法的基于内存的重写 若要提高性能,请在对“流”进行子分类时重写基于内存的异步方法。然后,在基于内存的方法中实现基于数组的方法。 CA1845:使用基于跨度的“string.Concat” 使用AsSpan和string.Concat比使用Substring和串联运算符更高效。 CA1846:首选AsSpan,次选Substring AsSpan比Substring更高效。Substring执行O(n)字符串复制,而AsSpan不会执行此操作且具有固定成本。AsSpan也不执行任何堆分配。 CA1847:对单个字符查找使用char文本 搜索单个字符时使用string.Contains(char)而不是string.Contains(string)CA1849:当在异步方法中时,调用异步方法 在已属于异步的方法中,对其他方法的调用应指向其存在的异步版本。 CA1850:首选静态HashData方法,而非ComputeHash 相比创建并管理HashAlgorithm实例来调用ComputeHash,使用静态HashData方法更高效。 CA2000:丢失范围之前释放对象 由于可能发生异常事件,导致对象的终结器无法运行,因此,应显式释放对象,以避免对该对象的所有引用超出范围。 CA2002:不要锁定具有弱标识的对象 当可以跨应用程序域边界直接进行访问对象时,则认为该对象具有弱标识。对于尝试获取对具有弱标识的对象的锁的线程,该线程可能会被其他应用程序域中持有对同一对象的锁的另一线程所阻止。 CA2007:不直接等待任务 异步方法会直接等待Task。异步方法直接等待Task时,延续任务出现在创建任务的同一线程中。此行为可能会降低性能,并且可能会导致UI线程发生死锁。请考虑调用Task.ConfigureAwait(Boolean)以表示延续任务意图。 CA2008:不要在未传递TaskScheduler的情况下创建任务 任务创建或延续操作使用未指定TaskScheduler参数的方法重载。 CA2009:请勿对ImmutableCollection值调用ToImmutableCollection 没有必要在System.Collections.Immutable命名空间的不可变集合上调用ToImmutable方法。 CA2011:请勿在其资源库中分配属性 属性在自身的set访问器中被意外赋值。 CA2012:正确使用ValueTask 从成员调用中返回的ValueTasks旨在直接等待。多次尝试使用ValueTask或在已知完成之前直接访问其结果可能会导致异常或损坏。忽略此类ValueTask可能指示出现功能Bug,还可能降低性能。 CA2013:请勿将ReferenceEquals与值类型结合使用 使用System.Object.ReferenceEquals比较值时,如果objA和objB是值类型,则在将其传递给ReferenceEquals方法之前将它们装箱。这意味着,即使objA和objB都表示值类型的同一个实例,ReferenceEquals方法也会返回false。 CA2014:请勿在循环中使用stackalloc。 仅在当前方法调用结束时,Stackalloc分配的堆栈空间才会释放。在循环中使用此方法可能导致无限堆栈增长,最终出现堆栈溢出的情况。 CA2015:请勿为派生自MemoryManager<T>的类型定义终结器 将终结器添加到派生自MemoryManager<T>的类型可能使内存在仍被Span<T>使用时得到释放。 CA2016:将CancellationToken参数转发到采用一个该参数的方法 将CancellationToken参数转发给方法来确保操作取消通知得到正确传播,或者在CancellationToken.None中显式传递,以指示有意不传播令牌。 CA2018Buffer.BlockCopy的count参数应指定要复制的字节数 使用Buffer.BlockCopy时,count参数指定要复制的字节数。应仅对元素大小正好为一个字节的数组将Array.Length用于count参数。byte、sbyte和bool数组具有大小为一个字节的元素。 CA2100:检查SQL查询是否存在安全漏洞 一个方法使用按该方法的字符串参数生成的字符串设置System.Data.IDbCommand.CommandText属性。此规则假定字符串参数中包含用户输入。基于用户输入生成的SQL命令字符串易于受到SQL注入式攻击。 CA2101:指定对P/Invoke字符串参数进行封送处理 某平台调用成员允许部分受信任的调用方,具有一个字符串参数,并且不显式封送该字符串。这可能导致潜在的安全漏洞。 CA2109:检查可见的事件处理程序 检测到公共事件处理方法或受保护事件处理方法。除非绝对必要,否则不应公开事件处理方法。 CA2119:密封满足私有接口的方法 可继承的公共类型为internal(在VisualBasic中为Friend)接口提供可重写的方法实现。若要修复与此规则的冲突,请禁止方法在程序集外重写。 CA2153:避免处理损坏状态异常 损坏状态异常(CSE)指示进程中存在内存损坏。如果攻击者可以将攻击放置到损坏的内存区域,则捕获它们(而非允许进程崩溃)可能导致安全漏洞。 CA2200:再次引发以保留堆栈详细信息 再次引发某个异常,在throw语句中显式指定了该异常。如果通过在throw语句中指定异常来重新引发该异常,则引发该异常的原始方法与当前方法之间的方法调用的列表将丢失。 CA2201:不要引发保留的异常类型 这使得很难检测和调试原始错误。 CA2207:以内联方式初始化值类型的静态字段 某值类型声明了显式静态构造函数。要修复与该规则的冲突,请在声明它时初始化所有静态数据并移除静态构造函数。 CA2208:正确实例化参数异常 调用了异常类型ArgumentException或其派生类型的默认(无参数)构造函数,或者向异常类型ArgumentException或其派生类型的参数化构造函数传递了错误的字符串参数。 CA2211:非常量字段不应是可见的 不是常数也不是只读字段的静态字段不是线程安全的。必须严格控制对这类字段的访问,并需要高级编程技术来同步对类对象的访问。 CA2213:应释放可释放的字段 实现System.IDisposable的类型声明了同样实现IDisposable的类型的字段。字段的Dispose方法不由声明类型的Dispose方法调用。 CA2214:不要在构造函数中调用可重写的方法 构造函数调用虚方法时,可能尚未执行调用该方法的实例的构造函数。 CA2215:Dispose方法应调用基类释放 如果类型继承自可释放类型,则必须从它自己的Dispose方法中调用基类型的Dispose方法。 CA2216:可释放类型应声明终结器 实现System.IDisposable并包含建议使用非托管资源的字段的类型未实现Object.Finalize所描述的终结器。 CA2218:重写Equals时重写GetHashCode 公共类型重写System.Object.Equals,但不重写System.Object.GetHashCodeCA2217:不要使用FlagsAttribute标记枚举 外部可见的枚举使用FlagsAttribute标记,并且它包含的一个或多个值不是2的幂或不是为该枚举定义的其他值的组合。 CA2219:在异常子句中不引发异常 如果在finally或fault子句中引发异常,新异常将隐藏活动异常。当在filter子句中引发异常时,运行时会在不提示的情况下捕捉异常。这使得很难检测和调试原始错误。 CA2224:重载相等运算符时重写Equals方法 公共类型会实现相等运算符,但不重写System.Object.EqualsCA2225:运算符重载具有命名的备用项 检测到运算符重载,但未找到预期的指定备用方法。命名的备用成员提供了对与运算符相同的功能的访问,它提供给开发人员,在用不支持重载运算符的语言进行编程时使用。 CA2226:运算符应有对称重载 某个类型实现了相等运算符或不等运算符,却未实现相反运算符。 CA2227:集合属性应为只读 使用可写的集合属性,用户可以将该集合替换为不同的集合。只读属性禁止替换该集合,但仍允许设置单个成员。 CA2229:实现序列化构造函数 要修复与该规则的冲突,请实现序列化构造函数。对于密封类,请使构造函数成为私有;否则,请使构造函数成为受保护。 CA2231:重写ValueType.Equals时应重载相等运算符 值类型重写Object.Equals,但未实现相等运算符。 CA2234:传递System.Uri对象,而不传递字符串 调用了带有一个字符串参数的方法,该参数的名称中包含“uri”、“URI”、“urn”、“URN”、“url”或“URL”。此方法的声明类型包含具有System.Uri参数的对应方法重载。 CA2235:标记所有不可序列化的字段 在可以序列化的类型中声明了类型不可序列化的实例字段。 CA2237:用SerializableAttribute标记ISerializable类型 若要被公共语言运行时识别为可序列化,类型必须用SerializableAttribute特性标记,即使该类型通过实现ISerializable接口使用了自定义的序列化例程也是如此。 CA2241:为格式化方法提供正确的参数 传递给System.String.Format的format自变量不包含对应于每个对象自变量的格式项,反之亦然。 CA2242:正确测试NaN 此表达式对照Single.NanDouble.Nan测试某个值。使用Single.IsNan(Single)Double.IsNan(Double)测试该值。 CA2243:特性字符串文本应正确分析 特性的字符串文本参数不能正确解析为URL、GUID或版本。 CA2244:不要复制已索引的元素初始值设定项 对象初始值设定项有多个具有相同常量索引的索引元素初始值设定项。除最后一个初始值设定项之外,其余都是冗余的。 CA2245:请勿将属性分配给其自身 属性意外赋值给了其自身。 CA2246:请勿在同一语句中分配符号及其成员 不建议在同一语句中分配符号及其成员(即字段或属性)。目前尚不清楚成员访问是打算在赋值之前使用符号的旧值还是打算使用此语句中赋值的新值。 CA2247:传递给TaskCompletionSource构造函数的参数应为TaskCreationOptions枚举,而不是TaskContinuationOptions枚举。 TaskCompletionSource既有采用控制基础任务的TaskCreationOptions的构造函数,也有采用任务中存储的对象状态的构造函数。如果意外传递TaskContinuationOptions而不是TaskCreationOptions,则将导致调用将选项视为状态。 CA2248:向Enum.HasFlag提供正确的enum实参 作为实参传递给HasFlag方法调用的枚举类型不同于调用枚举类型。 CA2249:请考虑使用String.Contains而不是String.IndexOfstring.IndexOf的调用(其结果用于检查是否存在子字符串)可以用string.Contains替换。 CA2250:使用ThrowIfCancellationRequested ThrowIfCancellationRequested自动检查令牌是否已取消,如果已取消,则引发OperationCanceledException。 CA2251:使用String.Equals代替String.Compare 与其将String.Compare的结果与零进行比较,不如使用String.Equals,这样更清晰且速度可能更快。 CA2252:选择预览功能 使用预览API之前选择预览功能。 CA2300:请勿使用不安全的反序列化程序BinaryFormatte 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2301:在未先设置BinaryFormatter.Binder的情况下,请不要调用BinaryFormatter.Deserialize 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2302:在调用BinaryFormatter.Deserialize之前,确保设置BinaryFormatter.Binder 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2305:请勿使用不安全的反序列化程序LosFormatter 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2310:请勿使用不安全的反序列化程序NetDataContractSerializer 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2311:在未先设置NetDataContractSerializer.Binder的情况下,请不要反序列化 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2312:确保在反序列化之前设置NetDataContractSerializer.Binder 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2315:请勿使用不安全的反序列化程序ObjectStateFormatter 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2321:请勿使用SimpleTypeResolverJavaScriptSerializer进行反序列化 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2322:确保在反序列化之前没有使用SimpleTypeResolver初始化JavaScriptSerializer 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2326:请勿使用None以外的TypeNameHandling值 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2327:不要使用不安全的JsonSerializerSettings 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2328:确保JsonSerializerSettings是安全的 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2329:不要使用不安全的配置反序列化JsonSerializer 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2330:在反序列化时确保JsonSerializer具有安全配置 反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 CA2350:确保DataTable.ReadXml()的输入受信任 对包含不受信任的输入的DataTable执行反序列化时,攻击者可能通过创建恶意输入实施拒绝服务攻击。有可能存在未知的远程代码执行漏洞。 CA2351:确保DataSet.ReadXml()的输入受信任 对包含不受信任的输入的DataSet执行反序列化时,攻击者可能通过创建恶意输入实施拒绝服务攻击。有可能存在未知的远程代码执行漏洞。 CA2352:可序列化类型中的不安全DataSetDataTable容易受到远程代码执行攻击 带有SerializableAttribute标记的类或结构包含DataSetDataTable字段或属性,但不具有GeneratedCodeAttributeCA2353:可序列化类型中的不安全DataSetDataTable 使用XML序列化特性或数据协定特性进行了标记的类或结构包含DataSetDataTable字段或属性。 CA2354:反序列化对象图中的不安全DataSetDataTable可能容易受到远程代码执行攻击 当使用序列化的System.Runtime.Serialization.IFormatter进行反序列化时,且强制转换的类型的对象图可能包含DataSet或DataTable时。 CA2355:反序列化对象图中的不安全DataSetDataTable 当强制转换的或指定的类型的对象图可能包含DataSet或DataTable类时,进行反序列化。 CA2356:Web反序列化的对象图中不安全的DataSetDataTable 带有System.Web.Services.WebMethodAttributeSystem.ServiceModel.OperationContractAttribute的方法具有可能引用DataSet或DataTable的参数。 CA2361:请确保包含DataSet.ReadXml()的自动生成的类没有与不受信任的数据一起使用 对包含不受信任的输入的DataSet执行反序列化时,攻击者可能通过创建恶意输入实施拒绝服务攻击。有可能存在未知的远程代码执行漏洞。 CA2362:自动生成的可序列化类型中不安全的数据集或数据表易受远程代码执行攻击 当反序列化具有BinaryFormatter的不受信任的输入且反序列化的对象图包含DataSetDataTable时,攻击者可能创建执行远程代码执行攻击的恶意有效负载。 CA3001:查看SQL注入漏洞的代码 使用不受信任的输入和SQL命令时,请注意防范SQL注入攻击。SQL注入攻击可以执行恶意的SQL命令,从而降低应用程序的安全性和完整性。 CA3002:查看XSS漏洞的代码 在处理来自Web请求的不受信任的输入时,请注意防范跨站脚本(XSS)攻击。XSS攻击会将不受信任的输入注入原始HTML输出,使攻击者可以执行恶意脚本或恶意修改网页中的内容。 CA3003:查看文件路径注入漏洞的代码 在处理来自Web请求的不受信任的输入时,请谨慎使用用户控制的输入指定文件路径。 CA3004:查看信息泄露漏洞的代码 泄漏异常信息可让攻击者深入了解应用程序的内部机制,从而帮助攻击者找到其他漏洞并利用这些漏洞。 CA3006:查看进程命令注入漏洞的代码 处理不受信任的输入时,请注意防范命令注入攻击。命令注入攻击可在基础操作系统上执行恶意命令,从而降低服务器的安全和完整性。 CA3007:查看公开重定向漏洞的代码 处理不受信任的输入时,请注意防范开放重定向漏洞。攻击者可以利用开放重定向漏洞,使用你的网站提供合法URL的外观,但将毫不知情的访客重定向到钓鱼网页或其他恶意网页。 CA3008:查看XPath注入漏洞的代码 处理不受信任的输入时,请注意防范XPath注入攻击。使用不受信任的输入构造XPath查询可能会允许攻击者恶意控制查询,使其返回一个意外的结果,并可能泄漏查询的XML的内容。 CA3009:查看XML注入漏洞的代码 处理不受信任的输入时,请注意防范XML注入攻击。 CA3010:查看XAML注入漏洞的代码 处理不受信任的输入时,请注意防范XAML注入攻击。XAML是一种直接表示对象实例化和执行的标记语言。这意味着XAML中创建的元素可以与系统资源(例如,网络访问和文件系统IO)交互。 CA3011:查看DLL注入漏洞的代码 处理不受信任的输入时,请谨慎加载不受信任的代码。如果你的Web应用加载不受信任的代码,攻击者可能能够将恶意DLL注入到你的进程中,并执行恶意代码。 CA3012:查看正则表达式注入漏洞的代码 处理不受信任的输入时,请注意防范正则表达式注入攻击。攻击者可以使用正则表达式注入恶意修改正则表达式,让正则表达式匹配非预期结果,或者让正则表达式占用过多CPU,从而形成拒绝服务攻击。 CA3061:请勿按URL添加架构 请勿使用不安全的“添加”方法重载,因为这可能会导致危险的外部引用。 CA3075:不安全的DTD处理 如果使用不安全的DTDProcessing实例或引用外部实体源,分析器可能会接受不受信任的输入并将敏感信息泄露给攻击者。 CA3076:不安全的XSLT脚本执行 如果在.NET应用程序中不安全地执行可扩展样式表语言转换(XSLT),处理器可能会解析不受信任的URI引用,这种引用会把敏感信息泄露给攻击者,从而导致拒绝服务和跨站点攻击。 CA3077:API设计、XML文档和XML文本读取器中的不安全处理 当设计派生自XMLDocumentXMLTextReader的API时,请注意DtdProcessing。当引用或解析外部实体源或设置XML中的不安全值时,使用不安全的DTDProcessing实例可能会导致信息泄露。 CA3147:使用ValidateAntiForgeryToken标记谓词处理程序 设计ASP.NET MVC控制器时,请注意防范跨网站请求伪造攻击。跨网站请求伪造攻击可将来自经过身份验证的用户的恶意请求发送到ASP.NETMVC控制器。 CA5350:请勿使用弱加密算法 出于多种原因,现今使用弱加密算法和哈希函数,但不应使用它们来保证保密性或它们所保护的数据的完整性。当此规则在代码中找到TripleDES、SHA1、或RIPEMD160算法时,此规则将触发。 CA5351:不使用损坏的加密算法 损坏的加密算法不安全,强烈建议不要使用。当此规则在代码中找到MD5哈希算法,或者DES或RC2加密算法时,此规则将触发。 CA5358:请勿使用不安全的密码模式 请勿使用不安全的密码模式 CA5359:请勿禁用证书验证 证书有助于对服务器的身份进行验证。客户端应验证服务器证书,确保将请求发送到目标服务器。如果ServerCertificateValidationCallback始终返回true,那么任何证书都将通过验证。 CA5360:在反序列化中不要调用危险的方法 不安全的反序列化是一种漏洞。当使用不受信任的数据来损害应用程序的逻辑,造成拒绝服务(DoS)攻击,或甚至在反序列化时任意执行代码,就会出现该漏洞。应用程序对受其控制的不受信任数据进行反序列化时,恶意用户很可能会滥用这些反序列化功能。具体来说,就是在反序列化过程中调用危险方法。如果攻击者成功执行不安全的反序列化攻击,就能实施更多攻击,如DoS攻击、绕过身份验证和执行远程代码。 CA5361:不禁用强加密的SChannel使用 将Switch.System.Net.DontEnableSchUseStrongCrypto设置为true会减弱传出的传输层安全性连接中使用的加密性。较弱的加密性会泄露应用程序与服务器之间通信的机密性,使攻击者更易于窃听敏感数据。 CA5362:反序列化对象图中存在潜在引用循环 反序列化不受信任的数据时,处理反序列化对象图的任何代码都需要在处理引用循环时不进入无限循环。这包括反序列化回叫中的一部分代码和在反序列化完成后处理对象图的代码。否则攻击者可能会利用带有包含引用循环的恶意数据执行拒绝服务攻击。 CA5363:请勿禁用请求验证 请求验证是ASP.NET中的一项功能,可检查HTTP请求并确定这些请求是否包含可能导致跨站点脚本编写等注入攻击的潜在危险内容。 CA5364:不使用已弃用的安全协议 传输层安全性(TLS)通常使用超文本传输协议安全(HTTPS)保障计算机之间的通信安全。早期版本的TLS协议不如TLS1.2和TLS1.3安全,且更容易出现新的漏洞。避免使用旧版本的协议,以便最大程度降低风险。 CA5365:请勿禁用HTTP头检查 通过HTTP标头检查,可对在响应头中找到的回车符和换行符(\r和\n)进行编码。此编码有助于避免注入攻击,这些注入攻击会攻击对标头包含的不受信数据进行回显的应用程序。 CA5366:将XmlReader用于数据集读取XML 使用DataSet读取包含不受信数据的XML,可能会加载危险的外部引用,应使用具有安全解析程序或禁用了DTD处理的XmlReader来限制这种行为。 CA5367:请勿序列化具有Pointer字段的类型 此规则检查是否存在带有指针字段或属性的可序列化类。无法进行序列化的成员可能是指针,例如使用NonSerializedAttribute进行标记的静态成员或字段。 CA5368:针对派生自Page的类设置ViewStateUserKey 设置ViewStateUserKey属性有助于防止对应用程序的攻击,方法是允许你为各个用户的视图状态变量分配标识符,这样攻击者就无法使用变量生成攻击。否则会出现“跨网站请求伪造”漏洞。 CA5369:将XmlReader用于反序列化 处理不受信任的DTD和XML架构时可能会加载危险的外部引用,应使用具有安全解析程序或禁用了DTD和XML内联架构处理的XmlReader来限制这种行为。 CA5370:将XmlReader用于验证读取器 处理不受信任的DTD和XML架构时可能会加载危险的外部引用。此危险的加载行为可使用具有安全解析程序或者禁用了DTD和XML内联架构处理的XmlReader来进行限制。 CA5371:将XmlReader用于架构读取 处理不受信任的DTD和XML架构时可能会加载危险的外部引用。请使用具有安全解析程序或者禁用了DTD和XML内联架构处理的XmlReader对其进行限制。 CA5372:将XmlReader用于XPathDocument 处理来自不受信任的数据的XML时可能会加载危险的外部引用,可使用具有安全解析程序或禁用了DTD处理的XmlReader对其进行限制。 CA5373:请勿使用已过时的密钥派生功能 此规则会检测对弱密钥派生方法System.Security.Cryptography.PasswordDeriveBytesRfc2898DeriveBytes.CryptDeriveKey的调用。System.Security.Cryptography.PasswordDeriveBytes使用了弱算法PBKDF1。 CA5374:请勿使用XslTransform 此规则检查System.Xml.Xsl.XslTransform是否在代码中进行了实例化。System.Xml.Xsl.XslTransform现已过时且不应使用。 CA5375:请勿使用帐户共享访问签名 帐户SAS可以委派对blob容器、表、队列和文件共享执行读取、写入和删除操作的访问权限,而这是服务SAS所不允许的。但是它不支持容器级别的策略,并且其灵活性和对授予的权限的控制力更低。一旦恶意用户获取它后,存储帐户的信息很容易泄露。 CA5376:使用SharedAccessProtocolHttpsOnly SAS是无法在HTTP上以纯文本形式传输的敏感数据。 CA5377:使用容器级别访问策略 容器级别的访问策略可以随时修改或撤销。它具有更高的灵活性,对授予的权限的控制力更强。 CA5378:不禁用ServicePointManagerSecurityProtocols 将Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols设置为true会将Windows Communication Framework(WCF)的传输层安全性(TLS)连接限制为使用TLS 1.0。该版本的TLS将被弃用。 CA5379:请勿使用弱密钥派生功能算法 Rfc2898DeriveBytes类默认使用SHA1算法。应指定在SHA256或更高版本的构造函数的某些重载中使用哈希算法。请注意,HashAlgorithm属性只具有get访问器,而没有overriden修饰符。 CA5380:请勿将证书添加到根存储中 此规则会对将证书添加到“受信任的根证书颁发机构”证书存储的代码进行检测。默认情况下,“受信任的根证书颁发机构”证书存储配置有一组符合Microsoft根证书计划要求的公共CA。 CA5381:请确保证书未添加到根存储中 此规则会对可能将证书添加到“受信任的根证书颁发机构”证书存储的代码进行检测。默认情况下,“受信任的根证书颁发机构”证书存储配置有一组符合Microsoft根证书计划要求的公共证书颁发机构(CA)。 CA5382:在ASP.NET Core中使用安全Cookie HTTPS上可用的应用程序必须使用安全Cookie,这会向浏览器指示,Cookie只能使用安全套接字层(SSL)进行传输。 CA5383:确保在ASP.NET Core中使用安全Cookie HTTPS上可用的应用程序必须使用安全Cookie,这会向浏览器指示,Cookie只能使用安全套接字层(SSL)进行传输。 CA5384:不使用数字签名算法(DSA) DSA是一种弱非对称加密算法。 CA5385:设置具有足够密钥大小的Rivest–Shamir–Adleman(RSA)算法 小于2048位的RSA密钥更容易受到暴力攻击。 CA5386:避免对SecurityProtocolType值进行硬编码 传输层安全性(TLS)通常使用安全超文本传输协议(HTTPS)保障计算机之间的通信安全。协议版本TLS 1.0和TLS 1.1已弃用,目前使用TLS 1.2和TLS 1.3。TLS 1.2和TLS 1.3将来可能也会弃用。要确保应用程序的安全性,请避免对协议版本进行硬编码,并且至少以.NET Framework v4.7.1为目标。 CA5387:请勿使用迭代计数不足的弱密钥派生功能 此规则检查加密密钥是否由迭代计数小于100,000的Rfc2898DeriveBytes生成。迭代计数较高有助于缓解尝试猜测已生成的加密密钥的字典攻击。 CA5388:使用弱密钥派生功能时,请确保迭代计数足够大 此规则检查加密密钥是否由迭代计数可能小于100,000的Rfc2898DeriveBytes生成。迭代计数较高有助于缓解尝试猜测已生成的加密密钥的字典攻击。 CA5389:请勿将存档项的路径添加到目标文件系统路径中 文件路径可以是相对的,并且可能导致文件系统访问预期文件系统目标路径以外的内容,从而导致攻击者通过“布局和等待”技术恶意更改配置和执行远程代码。 CA5390:请勿硬编码加密密钥 要成功使用对称算法,密钥必须只有发送方和接收方知道。如果密钥是硬编码的,就容易被发现。即使使用编译的二进制文件,恶意用户也容易将其提取出来。私钥泄露后,密码文本可直接被解密并且不再受保护。 CA5391:在ASP.NET Core MVC控制器中使用防伪造令牌 处理POST、PUT、PATCH或DELETE请求而不验证防伪造令牌可能易受到跨网站请求伪造攻击。跨网站请求伪造攻击可将经过身份验证的用户的恶意请求发送到ASP.NET Core MVC控制器。 CA5392:对P/Invoke使用DefaultDllImportSearchPaths特性 默认情况下,使用DllImportAttributeP/Invoke函数会探测大量目录,包括要加载的库的当前工作目录。这对于某些应用程序来说是一个安全隐患,会导致DLL劫持。 CA5393:请勿使用不安全的DllImportSearchPath值 默认的DLL搜索目录和程序集目录中可能存在恶意DLL。或者根据应用程序运行的位置,应用程序的目录中可能存在恶意DLL。 CA5394:请勿使用不安全的随机性 如果使用加密较弱的伪随机数生成器,攻击者可以预测将要生成的安全敏感值。 CA5395:缺少操作方法的HttpVerb特性 创建、编辑或以其它方式修改数据等所有操作方法都需要使用防伪特性来保护,以避免受跨网站请求伪造攻击的影响。执行GET操作应是没有副作用且不会修改持久数据的安全操作。 CA5396:将HttpCookie的HttpOnly设置为true 请确保将安全敏感的HTTPCookie标记为HttpOnly,这是一个深度防御措施。这表明Web浏览器应禁止脚本访问Cookie。注入恶意脚本是常见的窃取Cookie的方式。 CA5397:不使用已弃用的Ssl Protocols值 传输层安全性(TLS)通常使用安全超文本传输协议(HTTPS)保障计算机之间的通信安全。早期版本的TLS协议不如TLS 1.2和TLS 1.3安全,且更容易出现新的漏洞。避免使用旧版本的协议,以便最大程度降低风险。 CA5398:避免硬编码的Ssl Protocols值 传输层安全性(TLS)通常使用安全超文本传输协议(HTTPS)保障计算机之间的通信安全。协议版本TLS 1.0和TLS 1.1已弃用,目前使用TLS 1.2和TLS 1.3。将来可能也会弃用TLS 1.2和TLS 1.3。要确保应用程序的安全性,请避免对协议版本进行硬编码。 CA5399:绝对禁用HttpClient证书吊销列表检查 撤销的证书不再受信任。攻击者可能使用它来传递某些恶意数据或窃取HTTPS通信中的敏感数据。 CA5400:确保未禁用HttpClient证书吊销列表检查 撤销的证书不再受信任。攻击者可能使用它来传递某些恶意数据或窃取HTTPS通信中的敏感数据。 CA5401:不要将CreateEncryptor与非默认IV结合使用 对称加密应始终使用非可重复的初始化向量,以防止字典攻击。 CA5402:将CreateEncryptor与默认IV结合使用 对称加密应始终使用非可重复的初始化向量,以防止字典攻击。 CA5403:请勿硬编码证书 X509CertificateX509Certificate2构造函数的data或rawData参数是硬编码的。 CA5404:不要禁用令牌验证检查 用于控制令牌验证的TokenValidationParameters属性不应设置为false。 CA5405:不要始终跳过委托中的令牌验证 分配给AudienceValidatorLifetimeValidator的回调始终返回true。 IL3000当发布为单个文件时,避免访问程序集文件路径 当发布为单个文件时,避免访问程序集文件路径。 IL3001当发布为单个文件时,避免访问程序集文件路径 当发布为单个文件时,避免访问程序集文件路径。 IL3002当发布为单个文件时,避免调用使用“RequiresAssemblyFilesAttribute”批注的成员 当发布为单个文件时,避免调用使用“RequiresAssemblyFilesAttribute”批注的成员

.Net 5.0/6.0代码质量规则清单

https://github.com/dotnet/roslyn-analyzers/blob/main/src/NetAnalyzers/Core/AnalyzerReleases.Shipped.md

a. .Net 5系列(新增)

Rule ID Category Severity Notes Interoperability Warning DoNotUseOutAttributeStringPInvokeParametersAnalyzer, Documentation CA1501 Maintainability Disabled CodeMetricsAnalyzer, Documentation CA1502 Maintainability Disabled CodeMetricsAnalyzer, Documentation CA1505 Maintainability Disabled CodeMetricsAnalyzer, Documentation CA1506 Maintainability Disabled CodeMetricsAnalyzer, Documentation CA1507 Maintainability UseNameofInPlaceOfStringAnalyzer, Documentation CA1508 Maintainability Disabled AvoidDeadConditionalCode, Documentation CA1509 Maintainability Disabled CodeMetricsAnalyzer, Documentation CA1700 Naming Disabled DoNotNameEnumValuesReserved, Documentation CA1707 Naming Hidden IdentifiersShouldNotContainUnderscoresAnalyzer, Documentation CA1708 Naming Hidden IdentifiersShouldDifferByMoreThanCaseAnalyzer, Documentation CA1710 Naming Hidden IdentifiersShouldHaveCorrectSuffixAnalyzer, Documentation CA1711 Naming Hidden IdentifiersShouldNotHaveIncorrectSuffixAnalyzer, Documentation CA1712 Naming Hidden DoNotPrefixEnumValuesWithTypeNameAnalyzer, Documentation CA1713 Naming Disabled EventsShouldNotHaveBeforeOrAfterPrefix, Documentation CA1715 Naming Hidden IdentifiersShouldHaveCorrectPrefixAnalyzer, Documentation CA1716 Naming Hidden IdentifiersShouldNotMatchKeywordsAnalyzer, Documentation CA1720 Naming Hidden IdentifiersShouldNotContainTypeNames, Documentation CA1721 Naming Disabled PropertyNamesShouldNotMatchGetMethodsAnalyzer, Documentation CA1724 Naming Disabled TypeNamesShouldNotMatchNamespacesAnalyzer, Documentation CA1725 Naming Hidden ParameterNamesShouldMatchBaseDeclarationAnalyzer, Documentation CA1801 Usage Disabled ReviewUnusedParametersAnalyzer, Documentation CA1802 Performance Disabled UseLiteralsWhereAppropriateAnalyzer, Documentation CA1805 Performance Hidden DoNotInitializeUnnecessarilyAnalyzer, Documentation CA1806 Performance DoNotIgnoreMethodResultsAnalyzer, Documentation CA1810 Performance Disabled InitializeStaticFieldsInlineAnalyzer, Documentation CA1812 Performance Disabled AvoidUninstantiatedInternalClassesAnalyzer, Documentation CA1813 Performance Disabled AvoidUnsealedAttributesAnalyzer, Documentation CA1814 Performance Disabled PreferJaggedArraysOverMultidimensionalAnalyzer, Documentation CA1815 Performance Disabled OverrideEqualsAndOperatorEqualsOnValueTypesAnalyzer, Documentation CA1816 Usage CallGCSuppressFinalizeCorrectlyAnalyzer, Documentation CA1819 Performance Disabled PropertiesShouldNotReturnArraysAnalyzer, Documentation CA1820 Performance Disabled TestForEmptyStringsUsingStringLengthAnalyzer, Documentation CA1821 Performance RemoveEmptyFinalizersAnalyzer, Documentation CA1822 Performance MarkMembersAsStaticAnalyzer, Documentation CA1823 Performance Disabled AvoidUnusedPrivateFieldsAnalyzer, Documentation CA1824 Performance MarkAssembliesWithNeutralResourcesLanguageAnalyzer, Documentation CA1825 Performance AvoidZeroLengthArrayAllocationsAnalyzer, Documentation CA1826 Performance DoNotUseEnumerableMethodsOnIndexableCollectionsInsteadUseTheCollectionDirectlyAnalyzer, Documentation CA1827 Performance UseCountProperlyAnalyzer, Documentation CA1828 Performance UseCountProperlyAnalyzer, Documentation CA1829 Performance UseCountProperlyAnalyzer, Documentation CA1830 Performance PreferTypedStringBuilderAppendOverloads, Documentation CA1831 Performance Warning UseAsSpanInsteadOfRangeIndexerAnalyzer, Documentation CA1832 Performance UseAsSpanInsteadOfRangeIndexerAnalyzer, Documentation CA1833 Performance UseAsSpanInsteadOfRangeIndexerAnalyzer, Documentation CA1834 Performance PreferConstCharOverConstUnitStringAnalyzer, Documentation CA1835 Performance PreferStreamAsyncMemoryOverloads, Documentation CA1836 Performance UseCountProperlyAnalyzer, Documentation CA1837 Performance UseEnvironmentProcessId, Documentation CA1838 Performance Hidden AvoidStringBuilderPInvokeParametersAnalyzer, Documentation CA2000 Reliability Disabled DisposeObjectsBeforeLosingScope, Documentation CA2002 Reliability Disabled DoNotLockOnObjectsWithWeakIdentityAnalyzer, Documentation CA2007 Reliability Disabled DoNotDirectlyAwaitATaskAnalyzer, Documentation CA2008 Reliability Disabled DoNotCreateTasksWithoutPassingATaskSchedulerAnalyzer, Documentation CA2009 Reliability DoNotCallToImmutableCollectionOnAnImmutableCollectionValueAnalyzer, Documentation CA2011 Reliability AvoidInfiniteRecursion, Documentation CA2012 Reliability UseValueTasksCorrectlyAnalyzer, Documentation CA2013 Reliability Warning DoNotUseReferenceEqualsWithValueTypesAnalyzer, Documentation CA2014 Reliability Warning CSharpDoNotUseStackallocInLoopsAnalyzer, Documentation CA2015 Reliability Warning DoNotDefineFinalizersForTypesDerivedFromMemoryManager, Documentation CA2016 Reliability ForwardCancellationTokenToInvocationsAnalyzer, Documentation CA2100 Security Disabled ReviewSqlQueriesForSecurityVulnerabilities, Documentation CA2101 Globalization PInvokeDiagnosticAnalyzer, Documentation CA2109 Security Disabled ReviewVisibleEventHandlersAnalyzer, Documentation CA2119 Security Disabled SealMethodsThatSatisfyPrivateInterfacesAnalyzer, Documentation CA2153 Security Disabled DoNotCatchCorruptedStateExceptionsAnalyzer, Documentation CA2200 Usage Warning RethrowToPreserveStackDetailsAnalyzer, Documentation CA2201 Usage Hidden DoNotRaiseReservedExceptionTypesAnalyzer, Documentation CA2207 Usage Disabled InitializeStaticFieldsInlineAnalyzer, Documentation CA2208 Usage InstantiateArgumentExceptionsCorrectlyAnalyzer, Documentation CA2211 Usage NonConstantFieldsShouldNotBeVisibleAnalyzer, Documentation CA2213 Usage Disabled DisposableFieldsShouldBeDisposed, Documentation CA2214 Usage Disabled DoNotCallOverridableMethodsInConstructorsAnalyzer, Documentation CA2215 Usage Hidden DisposeMethodsShouldCallBaseClassDispose, Documentation CA2216 Usage Disabled DisposableTypesShouldDeclareFinalizerAnalyzer, Documentation CA2217 Usage Disabled EnumWithFlagsAttributeAnalyzer, Documentation CA2219 Usage DoNotRaiseExceptionsInExceptionClausesAnalyzer, Documentation CA2225 Usage Disabled OperatorOverloadsHaveNamedAlternatesAnalyzer, Documentation CA2226 Usage Disabled OperatorsShouldHaveSymmetricalOverloadsAnalyzer, Documentation CA2227 Usage Disabled CollectionPropertiesShouldBeReadOnlyAnalyzer, Documentation CA2229 Usage Hidden SerializationRulesDiagnosticAnalyzer, Documentation CA2231 Usage OverloadOperatorEqualsOnOverridingValueTypeEqualsAnalyzer, Documentation CA2234 Usage Disabled PassSystemUriObjectsInsteadOfStringsAnalyzer, Documentation CA2235 Usage Disabled SerializationRulesDiagnosticAnalyzer, Documentation CA2237 Usage Disabled SerializationRulesDiagnosticAnalyzer, Documentation CA2241 Usage ProvideCorrectArgumentsToFormattingMethodsAnalyzer, Documentation CA2242 Usage TestForNaNCorrectlyAnalyzer, Documentation CA2243 Usage Disabled AttributeStringLiteralsShouldParseCorrectlyAnalyzer, Documentation CA2244 Usage AvoidDuplicateElementInitialization, Documentation CA2245 Usage AvoidPropertySelfAssignment, Documentation CA2246 Usage AssigningSymbolAndItsMemberInSameStatement, Documentation CA2247 Usage Warning DoNotCreateTaskCompletionSourceWithWrongArguments, Documentation CA2248 Usage ProvideCorrectArgumentToEnumHasFlag, Documentation CA2249 Usage PreferStringContainsOverIndexOfAnalyzer, Documentation CA2300 Security Disabled DoNotUseInsecureDeserializerBinaryFormatterMethods, Documentation CA2301 Security Disabled DoNotUseInsecureDeserializerBinaryFormatterWithoutBinder, Documentation CA2302 Security Disabled DoNotUseInsecureDeserializerBinaryFormatterWithoutBinder, Documentation CA2305 Security Disabled DoNotUseInsecureDeserializerLosFormatter, Documentation CA2310 Security Disabled DoNotUseInsecureDeserializerNetDataContractSerializerMethods, Documentation CA2311 Security Disabled DoNotUseInsecureDeserializerNetDataContractSerializerWithoutBinder, Documentation CA2312 Security Disabled DoNotUseInsecureDeserializerNetDataContractSerializerWithoutBinder, Documentation CA2315 Security Disabled DoNotUseInsecureDeserializerObjectStateFormatter, Documentation CA2321 Security Disabled DoNotUseInsecureDeserializerJavaScriptSerializerWithSimpleTypeResolver, Documentation CA2322 Security Disabled DoNotUseInsecureDeserializerJavaScriptSerializerWithSimpleTypeResolver, Documentation CA2326 Security Disabled JsonNetTypeNameHandling, Documentation CA2327 Security Disabled DoNotUseInsecureSettingsForJsonNet, Documentation CA2328 Security Disabled DoNotUseInsecureSettingsForJsonNet, Documentation CA2329 Security Disabled DoNotUseInsecureDeserializerJsonNetWithoutBinder, Documentation CA2330 Security Disabled DoNotUseInsecureDeserializerJsonNetWithoutBinder, Documentation CA2350 Security Disabled DoNotUseDataTableReadXml, Documentation CA2351 Security Disabled DoNotUseDataSetReadXml, Documentation CA2352 Security Disabled DataSetDataTableInSerializableTypeAnalyzer, Documentation CA2353 Security Disabled DataSetDataTableInSerializableTypeAnalyzer, Documentation CA2354 Security Disabled DataSetDataTableInIFormatterSerializableObjectGraphAnalyzer, Documentation CA2355 Security Disabled DataSetDataTableInSerializableObjectGraphAnalyzer, Documentation CA2356 Security Disabled DataSetDataTableInWebSerializableObjectGraphAnalyzer, Documentation CA2361 Security Disabled DoNotUseDataSetReadXml, Documentation CA2362 Security Disabled DataSetDataTableInSerializableTypeAnalyzer, Documentation CA3001 Security Disabled ReviewCodeForSqlInjectionVulnerabilities, Documentation CA3002 Security Disabled ReviewCodeForXssVulnerabilities, Documentation CA3003 Security Disabled ReviewCodeForFilePathInjectionVulnerabilities, Documentation CA3004 Security Disabled ReviewCodeForInformationDisclosureVulnerabilities, Documentation CA3005 Security Disabled ReviewCodeForLdapInjectionVulnerabilities, Documentation CA3006 Security Disabled ReviewCodeForCommandExecutionVulnerabilities, Documentation CA3007 Security Disabled ReviewCodeForOpenRedirectVulnerabilities, Documentation CA3008 Security Disabled ReviewCodeForXPathInjectionVulnerabilities, Documentation CA3009 Security Disabled ReviewCodeForXmlInjectionVulnerabilities, Documentation CA3010 Security Disabled ReviewCodeForXamlInjectionVulnerabilities, Documentation CA3011 Security Disabled ReviewCodeForDllInjectionVulnerabilities, Documentation CA3012 Security Disabled ReviewCodeForRegexInjectionVulnerabilities, Documentation CA3061 Security Hidden DoNotAddSchemaByURL, Documentation CA3075 Security Hidden DoNotUseInsecureDtdProcessingAnalyzer, Documentation CA3076 Security Hidden DoNotUseInsecureXSLTScriptExecutionAnalyzer, Documentation CA3077 Security Hidden DoNotUseInsecureDtdProcessingInApiDesignAnalyzer, Documentation CA3147 Security Hidden MarkVerbHandlersWithValidateAntiforgeryTokenAnalyzer, Documentation CA5350 Security Hidden DoNotUseInsecureCryptographicAlgorithmsAnalyzer, Documentation CA5351 Security Hidden DoNotUseInsecureCryptographicAlgorithmsAnalyzer, Documentation CA5358 Security Disabled ApprovedCipherModeAnalyzer, Documentation CA5359 Security Hidden DoNotDisableCertificateValidation, Documentation CA5360 Security Hidden DoNotCallDangerousMethodsInDeserialization, Documentation CA5361 Security Disabled DoNotSetSwitch, Documentation CA5362 Security Disabled PotentialReferenceCycleInDeserializedObjectGraph, Documentation CA5363 Security Hidden DoNotDisableRequestValidation, Documentation CA5364 Security Hidden DoNotUseDeprecatedSecurityProtocols, Documentation CA5365 Security Hidden DoNotDisableHTTPHeaderChecking, Documentation CA5366 Security Hidden UseXmlReaderForDataSetReadXml, Documentation CA5367 Security Disabled DoNotSerializeTypeWithPointerFields, Documentation CA5368 Security Hidden SetViewStateUserKey, Documentation CA5369 Security Hidden UseXmlReaderForDeserialize, Documentation CA5370 Security Hidden UseXmlReaderForValidatingReader, Documentation CA5371 Security Hidden UseXmlReaderForSchemaRead, Documentation CA5372 Security Hidden UseXmlReaderForXPathDocument, Documentation CA5373 Security Hidden DoNotUseObsoleteKDFAlgorithm, Documentation CA5374 Security Hidden DoNotUseXslTransform, Documentation CA5375 Security Disabled DoNotUseAccountSAS, Documentation CA5376 Security Disabled UseSharedAccessProtocolHttpsOnly, Documentation CA5377 Security Disabled UseContainerLevelAccessPolicy, Documentation CA5378 Security Disabled DoNotSetSwitch, Documentation CA5379 Security Hidden DoNotUseWeakKDFAlgorithm, Documentation CA5380 Security Disabled DoNotInstallRootCert, Documentation CA5381 Security Disabled DoNotInstallRootCert, Documentation CA5382 Security Disabled UseSecureCookiesASPNetCore, Documentation CA5383 Security Disabled UseSecureCookiesASPNetCore, Documentation CA5384 Security Hidden DoNotUseDSA, Documentation CA5385 Security Hidden UseRSAWithSufficientKeySize, Documentation CA5386 Security Disabled DoNotUseDeprecatedSecurityProtocols, Documentation CA5387 Security Disabled DoNotUseWeakKDFInsufficientIterationCount, Documentation CA5388 Security Disabled DoNotUseWeakKDFInsufficientIterationCount, Documentation CA5389 Security Disabled DoNotAddArchiveItemPathToTheTargetFileSystemPath, Documentation CA5390 Security Disabled DoNotHardCodeEncryptionKey, Documentation CA5391 Security Disabled UseAutoValidateAntiforgeryToken, Documentation CA5392 Security Disabled UseDefaultDllImportSearchPathsAttribute, Documentation CA5393 Security Disabled UseDefaultDllImportSearchPathsAttribute, Documentation CA5394 Security Disabled DoNotUseInsecureRandomness, Documentation CA5395 Security Disabled UseAutoValidateAntiforgeryToken, Documentation CA5396 Security Disabled SetHttpOnlyForHttpCookie, Documentation CA5397 Security Hidden SslProtocolsAnalyzer, Documentation CA5398 Security Disabled SslProtocolsAnalyzer, Documentation CA5399 Security Disabled DoNotDisableHttpClientCRLCheck, Documentation CA5400 Security Disabled DoNotDisableHttpClientCRLCheck, Documentation CA5401 Security Disabled DoNotUseCreateEncryptorWithNonDefaultIV, Documentation CA5402 Security Disabled DoNotUseCreateEncryptorWithNonDefaultIV, Documentation CA5403 Security Disabled DoNotHardCodeCertificate, Documentation IL3000 Publish Warning AvoidAssemblyLocationInSingleFile, Documentation IL3001 Publish Warning AvoidAssemblyLocationInSingleFile, Documentation

b. .Net 6系列(新增)

Rule ID Category Severity Notes

.Net代码样式规则索引

https://docs.microsoft.com/zh-cn/dotnet/fundamentals/code-analysis/style-rules/

代码样式规则子类别

大多数规则都有关联的选项用于自定义首选样式。这些规则分为以下几个子类别:

与C#或Visual Basic语言相关的规则。例如,可以指定定义变量时有关使用var的规则,或有关是否首选expression-bodied成员的规则。

  • 不必要的代码规则
  • 与不必要的代码有关的规则,指示可能的可读性、可维护性、性能或功能问题。例如,方法或未使用的私有字段、属性或方法中无法访问的代码是不必要的代码。

  • 格式设置规则
  • 与代码的布局和结构有关的规则,其作用是使代码更易于阅读。例如,可以指定有关Allman大括号或控制块中是否首选空格的规则。

    与代码元素命名相关的规则。例如,可以指定async方法名必须具有“Async”后缀。

    不属于其他类别的规则。

    代码样式规则索引

    IDE0003 删除this或Me限定 dotnet_style_qualification_for_field
    dotnet_style_qualification_for_property
    dotnet_style_qualification_for_method
    dotnet_style_qualification_for_event IDE0004 删除不必要的cast IDE0005 删除不必要的import IDE0007 用var替代显式类型 csharp_style_var_for_built_in_types
    csharp_style_var_when_type_is_apparent
    csharp_style_var_elsewhere IDE0008 用显式类型代替var csharp_style_var_for_built_in_types
    csharp_style_var_when_type_is_apparent
    csharp_style_var_elsewhere IDE0009 添加this或Me限定 dotnet_style_qualification_for_field
    dotnet_style_qualification_for_property
    dotnet_style_qualification_for_method
    dotnet_style_qualification_for_event IDE0010 将缺失的事例添加到switch语句 IDE0011 添加大括号 csharp_prefer_braces IDE0016 使用throw表达式 csharp_style_throw_expression IDE0017 使用对象初始值设定项 dotnet_style_object_initializer IDE0018 内联变量声明 csharp_style_inlined_variable_declaration IDE0019 使用模式匹配来避免as后跟null检查 csharp_style_pattern_matching_over_as_with_null_check IDE0020 使用模式匹配来避免后跟强制转换的is检查(带变量) csharp_style_pattern_matching_over_is_with_cast_check IDE0021 使用构造函数的表达式主体 csharp_style_expression_bodied_constructors IDE0022 使用方法的表达式主体 csharp_style_expression_bodied_methods IDE0023 使用转换运算符的表达式主体 csharp_style_expression_bodied_operators IDE0024 使用运算符的表达式主体 csharp_style_expression_bodied_operators IDE0025 使用属性的表达式主体 csharp_style_expression_bodied_properties IDE0026 使用索引器的表达式主体 csharp_style_expression_bodied_indexers IDE0027 为访问器使用表达式主体 csharp_style_expression_bodied_accessors IDE0028 使用集合初始值设定项 dotnet_style_collection_initializer IDE0029 使用coalesce表达式(不可为null的类型) dotnet_style_coalesce_expression IDE0030 使用coalesce表达式(可以为null的类型) dotnet_style_coalesce_expression IDE0031 使用Null传播 dotnet_style_null_propagation IDE0032 使用自动属性 dotnet_style_prefer_auto_properties IDE0033 使用显式提供的元组名称 dotnet_style_explicit_tuple_names IDE0034 简化default表达式 csharp_prefer_simple_default_expression IDE0035 删除无法访问的代码 IDE0036 对修饰符进行排序 csharp_preferred_modifier_order
    visual_basic_preferred_modifier_order IDE0037 使用推断的成员名称 dotnet_style_prefer_inferred_tuple_names
    dotnet_style_prefer_inferred_anonymous_type_member_names IDE0038 使用模式匹配来避免后跟强制转换的is检查(不带变量) csharp_style_pattern_matching_over_is_with_cast_check IDE0039 使用本地函数而不是Lambda csharp_style_pattern_local_over_anonymous_function IDE0040 添加可访问性修饰符 dotnet_style_require_accessibility_modifiers IDE0041 使用isnull检查 dotnet_style_prefer_is_null_check_over_reference_equality_method IDE0042 析构变量声明 csharp_style_deconstructed_variable_declaration IDE0044 添加readonly修饰符 dotnet_style_readonly_field IDE0045 使用条件表达式进行赋值 dotnet_style_prefer_conditional_expression_over_assignment IDE0046 使用return的条件表达式 dotnet_style_prefer_conditional_expression_over_return IDE0047 删除不必要的括号 dotnet_style_parentheses_in_arithmetic_binary_operators
    dotnet_style_parentheses_in_relational_binary_operators
    dotnet_style_parentheses_in_other_binary_operators
    dotnet_style_parentheses_in_other_operators IDE0048 为清楚起见,请添加括号 dotnet_style_parentheses_in_arithmetic_binary_operators
    dotnet_style_parentheses_in_relational_binary_operators
    dotnet_style_parentheses_in_other_binary_operators
    dotnet_style_parentheses_in_other_operators IDE0049 使用语言关键字,而非类型引用的框架类型名称 dotnet_style_predefined_type_for_locals_parameters_members
    dotnet_style_predefined_type_for_member_access IDE0050 将匿名类型转换为元组 IDE0051 删除未使用的私有成员 IDE0052 删除未读取的私有成员 IDE0053 使用Lambda的表达式主体 csharp_style_expression_bodied_lambdas IDE0054 使用复合分配 dotnet_style_prefer_compound_assignment IDE0055 IDE0056 使用索引运算符 csharp_style_prefer_index_operator IDE0057 使用范围运算符 csharp_style_prefer_range_operator IDE0058 删除未使用的表达式值 csharp_style_unused_value_expression_statement_preference
    visual_basic_style_unused_value_expression_statement_preference IDE0059 删除不必要的赋值 csharp_style_unused_value_assignment_preference visual_basic_style_unused_value_assignment_preference