乘風破浪,遇見最美Windows 11之現代Windows桌面應用開發 - .Net代碼分析器,由Roslyn引擎驅動的代碼質量分析和樣式規范檢查


什么是.Net代碼分析器

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

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

image

代碼分析器(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

image

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.NetAnalyzersNuGet包中使用該分析器。

前置准備工作

新建示例解決方案"HelloNetAnalyzers"

https://github.com/TaylorShi/HelloNetAnalyzers

dotnet new sln -o HelloNetAnalyzers
cd .\HelloNetAnalyzers\

image

新建示例桌面項目"demoForWpfCoreNet3"

新建示例項目demoForWpfCoreNet3並加到解決方案中。

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

image

新建示例桌面項目"demoForWpfCoreNet5"

新建示例項目demoForWpfCoreNet5並加到解決方案中。

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

image

新建示例桌面項目"demoForWpfCoreNet6"

新建示例項目demoForWpfCoreNet6並加到解決方案中。

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

image

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

image

image

image

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

image

image

image

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

image

image

image

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

新建示例項目demoForWinformsCoreNet3.0並加到解決方案中。

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

image

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

新建示例項目demoForWinformsCoreNet5.0並加到解決方案中。

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

image

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

新建示例項目demoForWinformsCoreNet6.0並加到解決方案中。

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

image

准備一段可供分析的代碼

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;
        }
    }
}

首先需要知道的是,這段代碼運行是沒有異常的。

image

.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或更高版本的項目默認啟用

image

b. 比.Net 5.0更早版本的默認是不啟用代碼分析

image

image

image

image

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中默認啟用的規則如下:

診斷ID 類別 嚴重性 說明
CA1416 互操作性 警告 平台兼容性分析器
CA1417 互操作性 警告 請勿對P/Invokes的字符串參數使用OutAttribute
CA1831 性能 警告 在合適的情況下,對字符串使用AsSpan而不是基於范圍的索引器
CA2013 可靠性 警告 請勿將ReferenceEquals與值類型結合使用
CA2014 可靠性 警告 請勿在循環中使用stackalloc
CA2015 可靠性 警告 請勿為派生自MemoryManager<T>的類型定義終結器
CA2200 使用情況 警告 再次引發以保留堆棧詳細信息
CA2247 使用情況 警告 傳遞到TaskCompletionSource構造函數的參數應為TaskCreationOptions枚舉,而不是TaskContinuationOptions

低於.Net 5.0設置代碼質量分析開啟

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>

image

image

image

image

安裝之后,在Visual Studio中會新增分析器依賴項。

image

b. .Net Framework項目通過命令行安裝Nuget包

在項目上右鍵選擇"管理Nuget程序包",搜索關鍵詞Microsoft.CodeAnalysis.NetAnalyzers檢索Nuget包安裝。

image

<?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>

image

image

.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中可用的選項值清單:

.NET5值 .NET6值 含義
AllDisabledByDefault None 默認情況下,禁用所有規則。可以選擇選擇加入各條規則,以啟用它們。
Default Default 默認模式,其中某些規則作為生成警告啟用,某些規則作為Visual Studio IDE建議啟用,其余規則被禁用。
Minimum Default模式更主動的模式。強烈建議生成實施的某些建議作為生成警告啟用。
Recommended Minimum模式更主動的模式,其中啟用了更多規則作為生成警告。
AllEnabledByDefault All 所有規則默認作為生成警告啟用。可以選擇選擇退出各條規則,以禁用它們。

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類別清單

每個規則類別的屬性名稱清單:

屬性名稱 規則類別
<AnalysisModeDesign> 設計規則
<AnalysisModeDocumentation> 文檔規則
<AnalysisModeGlobalization> 全球化規則
<AnalysisModeInteroperability> 可移植性和互操作性規則
<AnalysisModeMaintainability> 可維護性規則
<AnalysisModeNaming> 命名規則
<AnalysisModePerformance> 性能規則
<AnalysisModeSingleFile> 單文件應用程序規則
<AnalysisModeReliability> 可靠性規則
<AnalysisModeSecurity> 安全規則
<AnalysisModeStyle> 所有代碼樣式(IDEXXXX)規則
<AnalysisModeUsage> 用法規則

.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節點清單如下:

含義
latest 使用已發布的最新版代碼分析器。這是默認值
latest-<mode> 使用已發布的最新版代碼分析器。<mode>值確定啟用哪些規則。
preview 使用最新的代碼分析器(即使它們處於預覽狀態)。
preview-<mode> 使用最新的代碼分析器(即使它們處於預覽狀態)。<mode>值確定啟用哪些規則。
6.0 即使有較新的規則可用,也會使用可用於.NET 6版本的規則集。
6.0-<mode> 即使有較新的規則可用,也會使用可用於.NET 6版本的規則集。<mode>值確定啟用哪些規則。
6 即使有較新的規則可用,也會使用可用於.NET 6版本的規則集。
6-<mode> 即使有較新的規則可用,也會使用可用於.NET 6版本的規則集。<mode>值確定啟用哪些規則。
5.0 即使有較新的規則可用,也會使用可用於.NET 5版本的規則集。
5.0-<mode> 即使有較新的規則可用,也會使用可用於.NET 5版本的規則集。<mode>值確定啟用哪些規則。
5 即使有較新的規則可用,也會使用可用於.NET 5版本的規則集。
5-<mode> 即使有較新的規則可用,也會使用可用於.NET 5版本的規則集。<mode>值確定啟用哪些規則。

這里需要注意的是,對.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)

每個規則類別的屬性名稱清單如下:

屬性名稱 規則類別
<AnalysisLevelDesign> 設計規則
<AnalysisLevelDocumentation> 文檔規則
<AnalysisLevelGlobalization> 全球化規則
<AnalysisLevelInteroperability> 可移植性和互操作性規則
<AnalysisLevelMaintainability> 可維護性規則
<AnalysisLevelNaming> 命名規則
<AnalysisLevelPerformance> 性能規則
<AnalysisLevelSingleFile> 單文件應用程序規則
<AnalysisLevelReliability> 可靠性規則
<AnalysisLevelSecurity> 安全規則
<AnalysisLevelStyle> 所有代碼樣式(IDEXXXX)規則
<AnalysisLevelUsage> 用法規則

e. 查看啟用最新代碼分析的效果

當我們啟用了分析器並且設置代碼分析等級為最新的之后,我們將可以看到相關的代碼分析效果。

image

前面的示范代碼,被標記為了CA1822消息提示,這說明分析器正在運作。

image

當代碼被分析器提示時,它將是波浪線效果

image

通過Visual Studio啟用代碼分析並設置分析級別

其實也可以通過Visual Studio自帶的可視化界面來設置,在Visual Studio中在當前demoForWpfCoreNet5項目上右鍵進入"屬性"設置,可以找到"代碼分析"-"所有分析器"-".Net分析器",完成分析器啟用設置並且設置分析級別。

a. 在Visual Studio 2022中啟用代碼分析並設置分析級別

image

b. 在Visual Studio 2019中啟用代碼分析並設置分析級別

image

.Net 5.0/6.0設置規則嚴重級別

a. 已知配置規則的嚴重級別

已知的規則嚴重級別有:

嚴重性(解決方案資源管理器) 嚴重性(EditorConfig文件) 生成時行為 編輯器行為
錯誤 error 此類沖突在錯誤列表和命令行生成輸出中顯示為“錯誤”,並導致生成失敗。 違規代碼用紅色波浪下划線表示,並用滾動條中的紅色小框標記。
警告 warning 此類沖突在錯誤列表和命令行生成輸出中顯示為“警告”,但不會導致生成失敗。 違規代碼用綠色波浪下划線表示,並用滾動條中的綠色小框標記。
信息 suggestion 此類沖突在錯誤列表中顯示為“消息”,而不會在命令行生成輸出中顯示。 違規代碼用灰色波浪下划線表示,並用滾動條中的灰色小框標記。
Hidden silent 對用戶不可見。 對用戶不可見。但是,診斷會報告給IDE診斷引擎。
none 完全禁止顯示。 完全禁止顯示。
默認 default 對應於規則的默認嚴重性。若要確定規則的默認值,請查看“屬性”窗口。 對應於規則的默認嚴重性。

b. 通過EditorConfig文件配置規則的嚴重級別

如果你希望這樣的提示以更高級別的方式體現出來,比如是警告的提示,那么我們可以在這條信息上右鍵,直接設置它的set severity,比如這里我把它設置成Warning

image

我們會發現它會幫我們新建一個.editorconfig規則配置文件,在里面會具體指定某一條規則的警告級別,沒錯,這里正是幫我們把CA1822標記它的提示級別為警告。

[*.cs]

# CA1822: 將成員標記為 static
dotnet_diagnostic.CA1822.severity = warning

image

這時候重新編輯運行,我們看到它變成了嘆號的警告狀態了。

image

更近一步,我們還可以嘗試把它的提示級別設置為錯誤,你會發現它將變成紅色的錯誤提示,當然不用擔心的事,這不會導致錯誤的運行,它僅僅是分析后給出的一個建議。

[*.cs]

# CA1822: 將成員標記為 static
dotnet_diagnostic.CA1822.severity = error

image

.Net 5.0/6.0將警告視為錯誤阻斷生成或忽略

a. 在項目的生成設置中,我們可以設置將警告視為錯誤

image

<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>

通常,這將強迫我們去解決所有的警告,以便繼續生成項目。

image

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>

image

這時候,即使已經開啟了將警告視為錯誤設置,也不會影響項目生成。

.Net代碼樣式分析

.Net 5.0/6.0啟用代碼樣式分析

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

a. 默認代碼樣式分析處於禁用

通過代碼樣式分析(IDExxxx)規則,可在代碼庫中定義和維護一致的代碼樣式。

對於所有.NET項目的版本,.NET代碼樣式分析默認處於禁用狀態

image

b. 通過Visual Studio啟用代碼樣式分析

通過Visual Studio項目屬性設置中的代碼分析設置項勾選"在生成時強制實施代碼樣式(實驗性)"。

image

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>

image

d. 通過EditorConfig文件配置規則的嚴重級別

實際上之前我們已經看到一個代碼樣式分析的提示,它是IDE0051,暫時它只是一個提示,如果你想提交它的嚴重等級,歐克,你可以直接右鍵設置它的嚴重等級。

image

它將生成或者在已有的.editorconfig規則配置文件中幫我們新增關於IDE0051的嚴重等級。

[*.cs]

# IDE0051: 刪除未使用的私有成員
dotnet_diagnostic.IDE0051.severity = error

這時候重新編輯,你會看到,它編譯不成功了,因為我們把這個樣式檢查的嚴重等級設置為錯誤等級。

image

.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.GetHashCode
CA2217:不要使用FlagsAttribute標記枚舉 外部可見的枚舉使用FlagsAttribute標記,並且它包含的一個或多個值不是2的冪或不是為該枚舉定義的其他值的組合。
CA2219:在異常子句中不引發異常 如果在finally或fault子句中引發異常,新異常將隱藏活動異常。當在filter子句中引發異常時,運行時會在不提示的情況下捕捉異常。這使得很難檢測和調試原始錯誤。
CA2224:重載相等運算符時重寫Equals方法 公共類型會實現相等運算符,但不重寫System.Object.Equals
CA2225:運算符重載具有命名的備用項 檢測到運算符重載,但未找到預期的指定備用方法。命名的備用成員提供了對與運算符相同的功能的訪問,它提供給開發人員,在用不支持重載運算符的語言進行編程時使用。
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.IndexOf string.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字段或屬性,但不具有GeneratedCodeAttribute
CA2353:可序列化類型中的不安全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
CA1000 Design Hidden DoNotDeclareStaticMembersOnGenericTypesAnalyzer, Documentation
CA1001 Design Hidden TypesThatOwnDisposableFieldsShouldBeDisposableAnalyzer, Documentation
CA1002 Design Disabled DoNotExposeGenericLists, Documentation
CA1003 Design Disabled UseGenericEventHandlerInstancesAnalyzer, Documentation
CA1005 Design Disabled AvoidExcessiveParametersOnGenericTypes, Documentation
CA1008 Design Disabled EnumsShouldHaveZeroValueAnalyzer, Documentation
CA1010 Design Hidden CollectionsShouldImplementGenericInterfaceAnalyzer, Documentation
CA1012 Design Disabled AbstractTypesShouldNotHaveConstructorsAnalyzer, Documentation
CA1014 Design Disabled MarkAssembliesWithAttributesDiagnosticAnalyzer, Documentation
CA1016 Design Info MarkAssembliesWithAttributesDiagnosticAnalyzer, Documentation
CA1017 Design Disabled MarkAssembliesWithComVisibleAnalyzer, Documentation
CA1018 Design Info MarkAttributesWithAttributeUsageAnalyzer, Documentation
CA1019 Design Disabled DefineAccessorsForAttributeArgumentsAnalyzer, Documentation
CA1021 Design Disabled AvoidOutParameters, Documentation
CA1024 Design Disabled UsePropertiesWhereAppropriateAnalyzer, Documentation
CA1027 Design Disabled EnumWithFlagsAttributeAnalyzer, Documentation
CA1028 Design Disabled EnumStorageShouldBeInt32Analyzer, Documentation
CA1030 Design Disabled UseEventsWhereAppropriateAnalyzer, Documentation
CA1031 Design Disabled DoNotCatchGeneralExceptionTypesAnalyzer, Documentation
CA1032 Design Disabled ImplementStandardExceptionConstructorsAnalyzer, Documentation
CA1033 Design Disabled InterfaceMethodsShouldBeCallableByChildTypesAnalyzer, Documentation
CA1034 Design Disabled NestedTypesShouldNotBeVisibleAnalyzer, Documentation
CA1036 Design Hidden OverrideMethodsOnComparableTypesAnalyzer, Documentation
CA1040 Design Disabled AvoidEmptyInterfacesAnalyzer, Documentation
CA1041 Design Info ProvideObsoleteAttributeMessageAnalyzer, Documentation
CA1043 Design Disabled UseIntegralOrStringArgumentForIndexersAnalyzer, Documentation
CA1044 Design Disabled PropertiesShouldNotBeWriteOnlyAnalyzer, Documentation
CA1045 Design Disabled DoNotPassTypesByReference, Documentation
CA1046 Design Disabled DoNotOverloadOperatorEqualsOnReferenceTypes, Documentation
CA1047 Design Info DoNotDeclareProtectedMembersInSealedTypes, Documentation
CA1050 Design Info DeclareTypesInNamespacesAnalyzer, Documentation
CA1051 Design Hidden DoNotDeclareVisibleInstanceFieldsAnalyzer, Documentation
CA1052 Design Disabled StaticHolderTypesAnalyzer, Documentation
CA1054 Design Disabled UriParametersShouldNotBeStringsAnalyzer, Documentation
CA1055 Design Disabled UriReturnValuesShouldNotBeStringsAnalyzer, Documentation
CA1056 Design Disabled UriPropertiesShouldNotBeStringsAnalyzer, Documentation
CA1058 Design Disabled TypesShouldNotExtendCertainBaseTypesAnalyzer, Documentation
CA1060 Design Disabled MovePInvokesToNativeMethodsClassAnalyzer, Documentation
CA1061 Design Info DoNotHideBaseClassMethodsAnalyzer, Documentation
CA1062 Design Disabled ValidateArgumentsOfPublicMethods, Documentation
CA1063 Design Disabled ImplementIDisposableCorrectlyAnalyzer, Documentation
CA1064 Design Disabled ExceptionsShouldBePublicAnalyzer, Documentation
CA1065 Design Disabled DoNotRaiseExceptionsInUnexpectedLocationsAnalyzer, Documentation
CA1066 Design Disabled EquatableAnalyzer, Documentation
CA1067 Design Info EquatableAnalyzer, Documentation
CA1068 Design Info CancellationTokenParametersMustComeLastAnalyzer, Documentation
CA1069 Design Info EnumShouldNotHaveDuplicatedValues, Documentation
CA1070 Design Info DoNotDeclareEventFieldsAsVirtual, Documentation
CA1200 Documentation Hidden AvoidUsingCrefTagsWithAPrefixAnalyzer, Documentation
CA1303 Globalization Disabled DoNotPassLiteralsAsLocalizedParameters, Documentation
CA1304 Globalization Hidden SpecifyCultureInfoAnalyzer, Documentation
CA1305 Globalization Hidden SpecifyIFormatProviderAnalyzer, Documentation
CA1307 Globalization Disabled SpecifyStringComparisonAnalyzer, Documentation
CA1308 Globalization Disabled NormalizeStringsToUppercaseAnalyzer, Documentation
CA1309 Globalization Hidden UseOrdinalStringComparisonAnalyzer, Documentation
CA1310 Globalization Hidden SpecifyStringComparisonAnalyzer, Documentation
CA1401 Interoperability Info PInvokeDiagnosticAnalyzer, Documentation
CA1416 Interoperability Warning PlatformCompatibilityAnalyzer, Documentation
CA1417 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 Info 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 Info 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 Info CallGCSuppressFinalizeCorrectlyAnalyzer, Documentation
CA1819 Performance Disabled PropertiesShouldNotReturnArraysAnalyzer, Documentation
CA1820 Performance Disabled TestForEmptyStringsUsingStringLengthAnalyzer, Documentation
CA1821 Performance Info RemoveEmptyFinalizersAnalyzer, Documentation
CA1822 Performance Info MarkMembersAsStaticAnalyzer, Documentation
CA1823 Performance Disabled AvoidUnusedPrivateFieldsAnalyzer, Documentation
CA1824 Performance Info MarkAssembliesWithNeutralResourcesLanguageAnalyzer, Documentation
CA1825 Performance Info AvoidZeroLengthArrayAllocationsAnalyzer, Documentation
CA1826 Performance Info DoNotUseEnumerableMethodsOnIndexableCollectionsInsteadUseTheCollectionDirectlyAnalyzer, Documentation
CA1827 Performance Info UseCountProperlyAnalyzer, Documentation
CA1828 Performance Info UseCountProperlyAnalyzer, Documentation
CA1829 Performance Info UseCountProperlyAnalyzer, Documentation
CA1830 Performance Info PreferTypedStringBuilderAppendOverloads, Documentation
CA1831 Performance Warning UseAsSpanInsteadOfRangeIndexerAnalyzer, Documentation
CA1832 Performance Info UseAsSpanInsteadOfRangeIndexerAnalyzer, Documentation
CA1833 Performance Info UseAsSpanInsteadOfRangeIndexerAnalyzer, Documentation
CA1834 Performance Info PreferConstCharOverConstUnitStringAnalyzer, Documentation
CA1835 Performance Info PreferStreamAsyncMemoryOverloads, Documentation
CA1836 Performance Info UseCountProperlyAnalyzer, Documentation
CA1837 Performance Info 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 Info DoNotCallToImmutableCollectionOnAnImmutableCollectionValueAnalyzer, Documentation
CA2011 Reliability Info AvoidInfiniteRecursion, Documentation
CA2012 Reliability Info UseValueTasksCorrectlyAnalyzer, Documentation
CA2013 Reliability Warning DoNotUseReferenceEqualsWithValueTypesAnalyzer, Documentation
CA2014 Reliability Warning CSharpDoNotUseStackallocInLoopsAnalyzer, Documentation
CA2015 Reliability Warning DoNotDefineFinalizersForTypesDerivedFromMemoryManager, Documentation
CA2016 Reliability Info ForwardCancellationTokenToInvocationsAnalyzer, Documentation
CA2100 Security Disabled ReviewSqlQueriesForSecurityVulnerabilities, Documentation
CA2101 Globalization Info 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 Info InstantiateArgumentExceptionsCorrectlyAnalyzer, Documentation
CA2211 Usage Info 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 Info DoNotRaiseExceptionsInExceptionClausesAnalyzer, Documentation
CA2225 Usage Disabled OperatorOverloadsHaveNamedAlternatesAnalyzer, Documentation
CA2226 Usage Disabled OperatorsShouldHaveSymmetricalOverloadsAnalyzer, Documentation
CA2227 Usage Disabled CollectionPropertiesShouldBeReadOnlyAnalyzer, Documentation
CA2229 Usage Hidden SerializationRulesDiagnosticAnalyzer, Documentation
CA2231 Usage Info OverloadOperatorEqualsOnOverridingValueTypeEqualsAnalyzer, Documentation
CA2234 Usage Disabled PassSystemUriObjectsInsteadOfStringsAnalyzer, Documentation
CA2235 Usage Disabled SerializationRulesDiagnosticAnalyzer, Documentation
CA2237 Usage Disabled SerializationRulesDiagnosticAnalyzer, Documentation
CA2241 Usage Info ProvideCorrectArgumentsToFormattingMethodsAnalyzer, Documentation
CA2242 Usage Info TestForNaNCorrectlyAnalyzer, Documentation
CA2243 Usage Disabled AttributeStringLiteralsShouldParseCorrectlyAnalyzer, Documentation
CA2244 Usage Info AvoidDuplicateElementInitialization, Documentation
CA2245 Usage Info AvoidPropertySelfAssignment, Documentation
CA2246 Usage Info AssigningSymbolAndItsMemberInSameStatement, Documentation
CA2247 Usage Warning DoNotCreateTaskCompletionSourceWithWrongArguments, Documentation
CA2248 Usage Info ProvideCorrectArgumentToEnumHasFlag, Documentation
CA2249 Usage Info 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
CA1418 Interoperability Warning UseValidPlatformString, Documentation
CA1419 Interoperability Info ProvidePublicParameterlessSafeHandleConstructor, Documentation
CA1727 Naming Hidden LoggerMessageDefineAnalyzer, Documentation
CA1839 Performance Info UseEnvironmentMembers, Documentation
CA1840 Performance Info UseEnvironmentMembers, Documentation
CA1841 Performance Info PreferDictionaryContainsMethods, Documentation
CA1842 Performance Info DoNotUseWhenAllOrWaitAllWithSingleArgument, Documentation
CA1843 Performance Info DoNotUseWhenAllOrWaitAllWithSingleArgument, Documentation
CA1844 Performance Info ProvideStreamMemoryBasedAsyncOverrides, Documentation
CA1845 Performance Info UseSpanBasedStringConcat, Documentation
CA1846 Performance Info PreferAsSpanOverSubstring, Documentation
CA1847 Performance Info UseStringContainsCharOverloadWithSingleCharactersAnalyzer, Documentation
CA1848 Performance Hidden LoggerMessageDefineAnalyzer, Documentation
CA2017 Reliability Warning LoggerMessageDefineAnalyzer, Documentation
CA2018 Reliability Warning BufferBlockCopyLengthAnalyzer, Documentation
CA2250 Usage Info UseCancellationTokenThrowIfCancellationRequested, Documentation
CA2251 Usage Hidden UseStringEqualsOverStringCompare, Documentation
CA2252 Usage Error DetectPreviewFeatureAnalyzer, Documentation
CA2253 Usage Info LoggerMessageDefineAnalyzer, Documentation
CA2254 Usage Info LoggerMessageDefineAnalyzer, Documentation
CA2255 Usage Warning ModuleInitializerAttributeShouldNotBeUsedInLibraries, Documentation
CA2256 Usage Warning InterfaceMembersMissingImplementation, Documentation
CA2257 Usage Warning MembersDeclaredOnImplementationTypeMustBeStatic, Documentation
CA2258 Usage Warning DynamicInterfaceCastableImplementationUnsupported, Documentation

b. .Net 6系列(移除)

Rule ID Category Severity Notes
CA1801 Usage Disabled ReviewUnusedParametersAnalyzer, Documentation
IL3000 Publish Disabled Moved analyzer to mono/linker
IL3001 Publish Disabled Moved analyzer to mono/linker

.Net代碼樣式規則索引

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

代碼樣式規則子類別

大多數規則都有關聯的選項用於自定義首選樣式。這些規則分為以下幾個子類別:

  • 語言規則

與C#或Visual Basic語言相關的規則。例如,可以指定定義變量時有關使用var的規則,或有關是否首選expression-bodied成員的規則。

  • 不必要的代碼規則

與不必要的代碼有關的規則,指示可能的可讀性、可維護性、性能或功能問題。例如,方法或未使用的私有字段、屬性或方法中無法訪問的代碼是不必要的代碼。

  • 格式設置規則

與代碼的布局和結構有關的規則,其作用是使代碼更易於閱讀。例如,可以指定有關Allman大括號或控制塊中是否首選空格的規則。

  • 命名規則

與代碼元素命名相關的規則。例如,可以指定async方法名必須具有“Async”后綴。

  • 雜項規則

不屬於其他類別的規則。

代碼樣式規則索引

規則ID 標題 選項
IDE0001 簡化名稱
IDE0002 簡化成員訪問
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
IDE0060 刪除未使用的參數 dotnet_code_quality_unused_parameters
IDE0061 使用局部函數的表達式主體 csharp_style_expression_bodied_local_functions
IDE0062 將本地函數設置為靜態 csharp_prefer_static_local_function
IDE0063 使用簡單的using語句 csharp_prefer_simple_using_statement
IDE0064 將結構字段設置為可寫
IDE0065 using指令放置 csharp_using_directive_placement
IDE0066 使用switch表達式 csharp_style_prefer_switch_expression
IDE0070 使用System.HashCode.Combine
IDE0071 簡化內插 dotnet_style_prefer_simplified_interpolation
IDE0072 將缺失的事例添加到switch表達式
IDE0073 使用文件頭 file_header_template
IDE0074 使用聯合復合賦值 dotnet_style_prefer_compound_assignment
IDE0075 簡化條件表達式 dotnet_style_prefer_simplified_boolean_expressions
IDE0076 刪除無效的全局SuppressMessageAttribute
IDE0077 避免在全局SuppressMessageAttribute中使用舊格式目標
IDE0078 使用模式匹配 csharp_style_prefer_pattern_matching
IDE0079 刪除不必要的抑制 dotnet_remove_unnecessary_suppression_exclusions
IDE0080 刪除不必要的抑制運算符
IDE0081 刪除了ByVal
IDE0082 將typeof轉換為nameof
IDE0083 使用模式匹配(not運算符) csharp_style_prefer_not_pattern
IDE0084 使用模式匹配(IsNot運算符) visual_basic_style_prefer_isnot_expression
IDE0090 簡化new表達式 csharp_style_implicit_object_creation_when_type_is_apparent
IDE0100 刪除不必要的相等運算符
IDE0110 刪除不必要的棄元
IDE0140 簡化對象的創建 visual_basic_style_prefer_simplified_object_creation
IDE1005 使用條件委托調用 csharp_style_conditional_delegate_call
IDE1006 命名樣式

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM