共用方式為


.NET 原始程式碼分析概觀

.NET 編譯器平台 (Roslyn) 分析器會檢查 C# 或 Visual Basic 程式碼,以找出程式碼品質與樣式問題。 這些分析器隨附於 .NET SDK 中,您不需要個別安裝它們。 如果您的專案以 .NET 5 或更新版本為目標,依預設會啟用程式碼分析。 (如需在以 .NET Framework 為目標的專案中啟用程式碼分析的相關資訊,請參閱 在舊版專案中啟用程式碼分析

如果分析器發現違規,則會根據每個規則的設定方式,將違規回報為建議、警告或錯誤。 程式碼分析違規顯示時會附有前置詞 "CA" 或 "IDE",以便與編譯器錯誤區分。

程式碼品質分析

程式碼品質分析 ("CAxxxx") 規則會檢查 C# 或 Visual Basic 程式碼中是否有安全性、效能、設計和其他問題。 根據預設,以 .NET 5 或更新版本為目標的專案會啟用分析器。 您可將 EnableNETAnalyzers 屬性設為 true 來啟用以舊版 .NET 版本為目標的專案上程式碼分析。 您也可將 EnableNETAnalyzers 設定為 false,以停用專案的程式碼分析。

提示

如果您使用 Visual Studio,許多分析器規則都附有相關的 程式代碼修正,您可以套用它們來自動更正問題。 程式碼修正會顯示在燈泡圖示功能表中。

已啟用的規則

根據預設,下列規則會在 .NET 10 中啟用為錯誤或警告。 其他規則會啟用為建議。

診斷識別碼 類別 嚴重性 新增的版本 描述
CA1416 互通性 警告 .NET 5 驗證平台相容性
CA1417 互通性 警告 .NET 5 請勿對 P/Invokes 的字串參數使用 OutAttribute
CA1418 互通性 警告 .NET 6 請使用有效的平台字串
CA1420 互通性 警告 .NET 7 使用需要運行時封送的功能,當功能被停用時,會導致運行時例外
CA1422 互通性 警告 .NET 7 驗證平台相容性
CA1831 效能 警告 .NET 5 在適用情況下,請使用 AsSpan 作為字串,不要使用範圍型索引子
CA1856 效能 錯誤 .NET 8 ConstantExpected 屬性的使用方式不正確
CA1857 效能 警告 .NET 8 預期參數為常數
CA2013 可靠性 警告 .NET 5 請勿將 ReferenceEquals 與實值型別搭配使用
CA2014 可靠性 警告 .NET 5 請勿在迴圈中使用 stackalloc
CA2015 可靠性 警告 .NET 5 請勿為衍生自 MemoryManager<T> 的型別定義完成項
CA2017 可靠性 警告 .NET 6 參數計數不符
CA2018 可靠性 警告 .NET 6 count 的引數 Buffer.BlockCopy 應指定要複製的位元組數目
CA2021 可靠性 警告 .NET 8 請勿使用不相容的型別呼叫 Enumerable.Cast<T>Enumerable.OfType<T>
CA2022 可靠性 警告 .NET 9 避免使用 不切實際讀取 Stream.Read
CA2023 可靠性 警告 .NET 10 訊息範本中的大括弧無效
CA2200 使用方式 警告 .NET 5 必須重新擲回以保存堆疊詳細資料
CA2247 使用方式 警告 .NET 5 傳至 TaskCompletionSource 建構函式的引數應為 TaskCreationOptions 列舉而非 TaskContinuationOptions
CA2252 使用方式 錯誤 .NET 6 選擇加入預覽功能
CA2255 使用方式 警告 .NET 6 ModuleInitializer 屬性不應該用於程式庫中
CA2256 使用方式 警告 .NET 6 在父介面中宣告的所有成員,在 DynamicInterfaceCastableImplementation 屬性介面中都必須有實作
CA2257 使用方式 警告 .NET 6 在具有 DynamicInterfaceCastableImplementationAttribute 的介面上定義的成員應為 static
CA2258 使用方式 警告 .NET 6 不支援在 Visual Basic 中提供 DynamicInterfaceCastableImplementation 介面
CA2259 使用方式 警告 .NET 7 ThreadStatic 只會影響靜態欄位
CA2260 使用方式 警告 .NET 7 使用正確的型別參數
CA2261 使用方式 警告 .NET 8 請勿使用 ConfigureAwaitOptions.SuppressThrowing 搭配 Task<TResult>
CA2264 使用方式 警告 .NET 9 請勿將不可為 Null 的值傳遞至 ArgumentNullException.ThrowIfNull
CA2265 使用方式 警告 .NET 9 不要與 或比較Span<T>nulldefault

您可以變更這些規則的嚴重性以停用規則,或將其提升為錯誤。 您也可以啟用更多規則

啟用其他規則

分析模式是指未啟用任何規則、啟用了部分或所有規則的預先定義程式碼分析組態。 在預設分析模式 (Default) 中,只有少數規則會啟用為建置警告。 您可以設定專案檔中的 <AnalysisMode> 屬性,以變更專案的分析模式。 允許的值包括:

描述
None 所有規則都會停用。 您可以選擇加入 個別規則來啟用這些規則。
Default 預設模式,其中某些規則會啟用為建置警告,而某些規則會啟用為 Visual Studio IDE 建議,而其餘規則會停用。
Minimum Default 模式更積極的模式。 強烈建議進行建置強制執行的某些建議會啟用為建置警告。 若要查看包含哪些規則,請檢查 %ProgramFiles%/dotnet/sdk/[version]/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_[level]_minimum.globalconfig 檔案。 (針對 .NET 7 和更早的版本,副檔名為 .editorconfig。)
Recommended Minimum 模式更積極的模式,其中會將更多規則啟用為建置警告。 若要查看包含的規則,請檢查 %ProgramFiles%/dotnet/sdk/[version]/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_[level]_recommended.globalconfig 檔案。 (針對 .NET 7 和更早的版本,副檔名為 .editorconfig。)
All 所有規則都會啟用為建置警告*。 您可以選擇退出個別規則來停用這些規則。

* 如果將 設定為 AnalysisMode,或將 All 設定為 AnalysisLevel,以下規則將latest-all啟用:CA1017、CA1045、CA1005、CA1014、CA1060、CA1021 和程式碼度量分析器規則 (CA1501、CA1502、CA1505、CA1506 和 CA1509)。 這些舊版規則可能會在未來版本中淘汰。 不過,您仍然可以使用 dotnet_diagnostic.CAxxxx.severity = <severity> 項目來個別啟用這些規則。

您也可以省略 <AnalysisMode> 屬性的 <AnalysisLevel> 複合值。 例如,下列值會為最新版本啟用建議的規則集:<AnalysisLevel>latest-Recommended</AnalysisLevel>。 如需詳細資訊,請參閱AnalysisLevel

若要尋找每個可用規則的預設嚴重性,以及規則是否在 Default 分析模式中啟用,請參閱規則的完整清單

將警告視為錯誤

如果您在建置專案時使用 -warnaserror 旗標,則所有程式碼分析警告也都會被視為錯誤。 在使用 -warnaserror 時,若不想讓程式碼品質警告 (CAxxxx) 被視為錯誤,您可以在專案檔中將 CodeAnalysisTreatWarningsAsErrors MSBuild 屬性設定為 false

<PropertyGroup>
  <CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors>
</PropertyGroup>

您仍然會看到程式碼分析警告,但這並不會中斷您的建置。

最新的更新

根據預設,在升級至較新版的 .NET SDK 時,您將取得最新的程式碼分析規則和預設規則嚴重性。 例如,如果您不想要此行為,例如,您想要確保不會啟用或停用任何新規則,可以使用下列其中一種方式加以覆寫:

  • AnalysisLevel MSBuild 屬性設定為特定值,將警告鎖定於該規則集。 當您升級至較新的 SDK 時,仍會收到這些警告的錯誤修正,但不會啟用任何新的警告,也不會停用任何現有的警告。 例如,若要將規則集鎖定至隨附於 .NET SDK 8.0 版的規則,請將下列專案新增至您的項目檔。

    <PropertyGroup>
      <AnalysisLevel>8.0</AnalysisLevel>
    </PropertyGroup>
    

    提示

    AnalysisLevel 屬性的預設值為 latest,這表示當您移轉至較新版的 .NET SDK 時,一律會取得最新的程式碼分析規則。

    如需詳細資訊以及查看可能值的清單,請參閱 AnalysisLevel

  • 安裝 Microsoft.CodeAnalysis.NetAnalyzers NuGet 套件,將規則更新與 .NET SDK 更新分離。 對於以 .NET 5+ 為目標的專案,安裝該套件將會關閉內建 SDK 分析器。 如果 SDK 包含比 NuGet 套件還要新的分析器組件版本,您將會收到建置警告。 若要停用警告,請將 _SkipUpgradeNetAnalyzersNuGetWarning 屬性設定為 true

    注意

    如果您安裝 Microsoft.CodeAnalysis.NetAnalyzers NuGet 套件,就不應將 EnableNETAnalyzers 屬性新增至專案檔或 Directory.Build.props 檔案。 若已安裝 NuGet 套件,且 EnableNETAnalyzers 屬性設定為 true,則會產生建置警告。

程式碼樣式分析

程式碼樣式分析 ("IDExxxx") 規則可讓您在程式碼基底中定義及維護一致的程式碼樣式。 預設啟用設定如下:

  • 命令行建置:命令行組建上所有 .NET 項目預設會停用程式代碼樣式分析

    您可以在 命令行和 Visual Studio 內,在建置時啟用程式代碼樣式分析。 程式碼樣式違規會顯示為附有 "IDE" 前置詞的警告或錯誤。 這可讓您在建置期間強制執行一致的程式碼樣式。

  • Visual Studio:預設會針對 Visual Studio 內的所有 .NET 專案啟用程式代碼樣式分析,以程式代碼重構快速動作

如需程式碼樣式分析規則的完整清單,請參閱程式碼樣式規則

在建置時啟用

您可以從命令列和 Visual Studio 中建置時啟用程式代碼樣式分析。 (但基於效能考量,少數程式碼樣式規則仍僅適用於 Visual Studio IDE。)

請依照下列步驟,在建置時啟用程式碼樣式分析:

  1. 將 MSBuild 屬性 EnforceCodeStyleInBuild 設定為 true

  2. .editorconfig 檔案中,將您想要對建置執行的每個 "IDE" 程式碼樣式規則設定為警告或錯誤。 例如:

    [*.{cs,vb}]
    # IDE0040: Accessibility modifiers required (escalated to a build warning)
    dotnet_diagnostic.IDE0040.severity = warning
    

    提示

    從 .NET 9 開始,您也可以使用選項格式來指定嚴重性,並在建置階段加以遵守。 例如:

    [*.{cs,vb}]
    # IDE0040: Accessibility modifiers required (escalated to a build warning)
    dotnet_style_require_accessibility_modifiers = always:warning
    

    或者,您可以將整個類別預設為警告或錯誤,然後再選擇性地關閉您在該類別中不想對建置執行的規則。 例如:

    [*.{cs,vb}]
    
    # Default severity for analyzer diagnostics with category 'Style' (escalated to build warnings)
    dotnet_analyzer_diagnostic.category-Style.severity = warning
    
    # IDE0040: Accessibility modifiers required (disabled on build)
    dotnet_diagnostic.IDE0040.severity = silent
    

隱藏警告

隱藏違規的方式之一,是在 EditorConfig 檔案中將該規則識別碼的嚴重性選項設定為 none。 例如:

dotnet_diagnostic.CA1822.severity = none

如需隱藏警告的詳細資訊和其他方式,請參閱如何隱藏程式碼分析警告

在舊版專案中啟用程式碼分析

如果您的專案以 .NET 5 或更新版本為目標,依預設會啟用程式碼分析。 如果您的專案以 .NET Standard 或 .NET Framework 為目標,您必須將 EnableNETAnalyzers 屬性設定為 true,以手動啟用程式碼分析。

如果您的專案使用舊版專案檔案格式,也就是說,它不會參考 專案 SDK,您必須採取一些額外的步驟來啟用程式碼分析:

  1. 新增對 Microsoft.CodeAnalysis.NetAnalyzers NuGet 套件📦的參考。
  2. 不要設定 AnalysisLevel,這是非 SDK 樣式專案無法理解的,而是將下列屬性新增至您的專案檔:
  <EffectiveAnalysisLevel>9</EffectiveAnalysisLevel>
  <AnalysisMode>Recommended</AnalysisMode>

第三方分析器

除了官方的 .NET 分析器外,你也可以安裝第三方分析器,例如 StyleCopRoslynatorMeziantou.AnalyzerXUnit 分析器Sonar 分析器

另請參閱