什么是.Net代碼分析器
https://docs.microsoft.com/zh-cn/visualstudio/code-quality/roslyn-analyzers-overview?view=vs-2022
代碼分析器(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
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分析器。這些分析程序檢查代碼的安全性、性能和設計問題等。
.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"
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
節點並且設置成True
或False
。
<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>
安裝之后,在Visual Studio中會新增分析器依賴項。
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中可用的選項值清單:
.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. 查看啟用最新代碼分析的效果
當我們啟用了分析器並且設置代碼分析等級為最新的之后,我們將可以看到相關的代碼分析效果。
前面的示范代碼,被標記為了CA1822
消息提示,這說明分析器正在運作。
當代碼被分析器提示時,它將是波浪線效果
通過Visual Studio啟用代碼分析並設置分析級別
其實也可以通過Visual Studio自帶的可視化界面來設置,在Visual Studio中在當前demoForWpfCoreNet5
項目上右鍵進入"屬性"設置,可以找到"代碼分析"-"所有分析器"-".Net分析器",完成分析器啟用設置並且設置分析級別。
a. 在Visual Studio 2022中啟用代碼分析並設置分析級別
b. 在Visual Studio 2019中啟用代碼分析並設置分析級別
.Net 5.0/6.0設置規則嚴重級別
a. 已知配置規則的嚴重級別
已知的規則嚴重級別有:
嚴重性(解決方案資源管理器) | 嚴重性(EditorConfig文件) | 生成時行為 | 編輯器行為 |
---|---|---|---|
錯誤 | error |
此類沖突在錯誤列表和命令行生成輸出中顯示為“錯誤”,並導致生成失敗。 | 違規代碼用紅色波浪下划線表示,並用滾動條中的紅色小框標記。 |
警告 | warning |
此類沖突在錯誤列表和命令行生成輸出中顯示為“警告”,但不會導致生成失敗。 | 違規代碼用綠色波浪下划線表示,並用滾動條中的綠色小框標記。 |
信息 | suggestion |
此類沖突在錯誤列表中顯示為“消息”,而不會在命令行生成輸出中顯示。 | 違規代碼用灰色波浪下划線表示,並用滾動條中的灰色小框標記。 |
Hidden | silent |
對用戶不可見。 | 對用戶不可見。但是,診斷會報告給IDE診斷引擎。 |
無 | none |
完全禁止顯示。 | 完全禁止顯示。 |
默認 | default |
對應於規則的默認嚴重性。若要確定規則的默認值,請查看“屬性”窗口。 | 對應於規則的默認嚴重性。 |
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參數的重載。如果未提供CultureInfo 或System.IFormatProvider 對象,則重載成員提供的默認值可能不會在所有區域設置中產生您想要的效果。 |
CA1305:指定IFormatProvider | 某方法或構造函數調用的一個或多個成員有接受System.IFormatProvider 參數的重載,但該方法或構造函數沒有調用接受IFormatProvider參數的重載。如果未提供System.Globalization.CultureInfo 或IFormatProvider對象,則重載成員提供的默認值可能不會在所有區域設置中產生您想要的效果。 |
CA1307:為了清晰起見,請指定StringComparison | 字符串比較運算使用不設置StringComparison參數的方法重載。 |
CA1308:將字符串規范化為大寫 | 字符串應正常化為大寫字母。少量字符轉換為小寫字母后不能再轉換回來。 |
CA1309:使用按順序的StringComparison | 非語義的字符串比較運算不會將StringComparison參數設置為Ordinal或OrdinalIgnoreCase。因此,通過將參數顯式設置為StringComparison.Ordinal 或StringComparison.OrdinalIgnoreCase ,通常可以提高代碼的速度、正確性和可靠性。 |
CA1310:為了確保正確,請指定StringComparison | 字符串比較操作使用未設置StringComparison參數的方法重載,並默認使用區域性特定的字符串比較。 |
CA1401:P/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.ProcessId 比Process.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 中顯式傳遞,以指示有意不傳播令牌。 |
CA2018:Buffer.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.Nan 或Double.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:請勿使用SimpleTypeResolver 對JavaScriptSerializer 進行反序列化 |
反序列化不受信任的數據時,會對不安全的反序列化程序造成風險。攻擊者可能會修改序列化數據,使其包含非預期類型,進而注入具有不良副作用的對象。 |
CA2322:確保在反序列化之前沒有使用SimpleTypeResolver 初始化JavaScriptSerializer |
反序列化不受信任的數據時,會對不安全的反序列化程序造成風險。攻擊者可能會修改序列化數據,使其包含非預期類型,進而注入具有不良副作用的對象。 |
CA2326:請勿使用None以外的TypeNameHandling值 | 反序列化不受信任的數據時,會對不安全的反序列化程序造成風險。攻擊者可能會修改序列化數據,使其包含非預期類型,進而注入具有不良副作用的對象。 |
CA2327:不要使用不安全的JsonSerializerSettings |
反序列化不受信任的數據時,會對不安全的反序列化程序造成風險。攻擊者可能會修改序列化數據,使其包含非預期類型,進而注入具有不良副作用的對象。 |
CA2328:確保JsonSerializerSettings 是安全的 |
反序列化不受信任的數據時,會對不安全的反序列化程序造成風險。攻擊者可能會修改序列化數據,使其包含非預期類型,進而注入具有不良副作用的對象。 |
CA2329:不要使用不安全的配置反序列化JsonSerializer |
反序列化不受信任的數據時,會對不安全的反序列化程序造成風險。攻擊者可能會修改序列化數據,使其包含非預期類型,進而注入具有不良副作用的對象。 |
CA2330:在反序列化時確保JsonSerializer 具有安全配置 |
反序列化不受信任的數據時,會對不安全的反序列化程序造成風險。攻擊者可能會修改序列化數據,使其包含非預期類型,進而注入具有不良副作用的對象。 |
CA2350:確保DataTable.ReadXml() 的輸入受信任 |
對包含不受信任的輸入的DataTable 執行反序列化時,攻擊者可能通過創建惡意輸入實施拒絕服務攻擊。有可能存在未知的遠程代碼執行漏洞。 |
CA2351:確保DataSet.ReadXml() 的輸入受信任 |
對包含不受信任的輸入的DataSet 執行反序列化時,攻擊者可能通過創建惡意輸入實施拒絕服務攻擊。有可能存在未知的遠程代碼執行漏洞。 |
CA2352:可序列化類型中的不安全DataSet 或DataTable 容易受到遠程代碼執行攻擊 |
帶有SerializableAttribute 標記的類或結構包含DataSet 或DataTable 字段或屬性,但不具有GeneratedCodeAttribute 。 |
CA2353:可序列化類型中的不安全DataSet 或DataTable |
使用XML序列化特性或數據協定特性進行了標記的類或結構包含DataSet 或DataTable 字段或屬性。 |
CA2354:反序列化對象圖中的不安全DataSet 或DataTable 可能容易受到遠程代碼執行攻擊 |
當使用序列化的System.Runtime.Serialization.IFormatter 進行反序列化時,且強制轉換的類型的對象圖可能包含DataSet或DataTable時。 |
CA2355:反序列化對象圖中的不安全DataSet 或DataTable |
當強制轉換的或指定的類型的對象圖可能包含DataSet或DataTable類時,進行反序列化。 |
CA2356:Web反序列化的對象圖中不安全的DataSet 或DataTable |
帶有System.Web.Services.WebMethodAttribute 或System.ServiceModel.OperationContractAttribute 的方法具有可能引用DataSet或DataTable的參數。 |
CA2361:請確保包含DataSet.ReadXml() 的自動生成的類沒有與不受信任的數據一起使用 |
對包含不受信任的輸入的DataSet執行反序列化時,攻擊者可能通過創建惡意輸入實施拒絕服務攻擊。有可能存在未知的遠程代碼執行漏洞。 |
CA2362:自動生成的可序列化類型中不安全的數據集或數據表易受遠程代碼執行攻擊 | 當反序列化具有BinaryFormatter 的不受信任的輸入且反序列化的對象圖包含DataSet 或DataTable 時,攻擊者可能創建執行遠程代碼執行攻擊的惡意有效負載。 |
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文本讀取器中的不安全處理 | 當設計派生自XMLDocument 和XMLTextReader 的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.PasswordDeriveBytes 和Rfc2898DeriveBytes.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 特性 |
默認情況下,使用DllImportAttribute 的P/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:請勿硬編碼證書 | X509Certificate 或X509Certificate2 構造函數的data或rawData參數是硬編碼的。 |
CA5404:不要禁用令牌驗證檢查 | 用於控制令牌驗證的TokenValidationParameters 屬性不應設置為false。 |
CA5405:不要始終跳過委托中的令牌驗證 | 分配給AudienceValidator 或LifetimeValidator 的回調始終返回true。 |
IL3000當發布為單個文件時,避免訪問程序集文件路徑 | 當發布為單個文件時,避免訪問程序集文件路徑。 |
IL3001當發布為單個文件時,避免訪問程序集文件路徑 | 當發布為單個文件時,避免訪問程序集文件路徑。 |
IL3002當發布為單個文件時,避免調用使用“RequiresAssemblyFilesAttribute ”批注的成員 |
當發布為單個文件時,避免調用使用“RequiresAssemblyFilesAttribute ”批注的成員 |
.Net 5.0/6.0代碼質量規則清單
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 | 命名樣式 |