共用方式為


原始檔中隱藏項目概觀

更新:2007 年 11 月

原始檔中隱藏項目的功能可以透過使用 SuppressMessage 屬性 (Attribute) 來隱藏或忽略程式碼分析違規。SuppressMessage 屬性是條件屬性;只有當您在編譯時期定義了 CODE_ANALYSIS 條件式編譯時,這個屬性才會包含在 Managed 程式碼的 IL 中繼資料 (Metadata) 中。在 C++ 中,CA_SUPPRESS_MESSAGE 和 CA_GLOBAL_SUPPRESS_MESSAGE 這兩個巨集可達到相同的效果。

建議您在偵錯或簽入組件上使用原始檔中隱藏項目的功能,以避免可能不小心傳送原始檔中隱藏項目的中繼資料,以及因為中繼資料過度膨脹而影響執行或效能。

注意事項:

您不需要自己親手撰寫這些屬性。如需詳細資訊,請參閱 HOW TO:使用功能表項目隱藏警告

SuppressMessage 屬性

以滑鼠右鍵按一下 [錯誤清單] 中的程式碼分析警告,並按一下 [隱藏訊息] 後,您的程式碼或是專案的全域隱藏項目檔案中便會加入 SuppressMessage 屬性。

SuppressMessage 屬性具有下列格式:

<Scope:SuppressMessage("Rule Category", "Rule Id", "Justification", "MessageId", Scope = "Scope", Target = "Target")>
[Scope:SuppressMessage("Rule Category", "Rule Id", "Justification", "MessageId", Scope = "Scope", Target = "Target")]

其中:

  • Rule Category:在其中定義規則的分類。

  • Rule Id:規則的識別項。支援規則 Id 的簡短名稱和完整名稱。簡短名稱為 CAXXXX,而完整名稱為 CAXXXX:FriendlyTypeName。

  • Justification:記錄隱藏訊息原因的文字。

  • Message Id:每個訊息之問題的唯一識別項。

  • Scope:要隱藏警告的目標。如果未指定目標,就會將目標設定為屬性的目標。支援的範圍包括下列:

    • 模組

    • 命名空間

    • 資源

    • 類型

    • 成員

    • 參數

  • Target:用來在要隱藏的警告上指定目標的識別項。此識別項必須包含完整的項目名稱。

SuppressMessage 用法

程式碼分析警告會隱藏在套用 SuppressMessage 屬性執行個體 (Instance) 的層級。目的是為了讓隱藏資訊與發生違規的程式碼緊密結合。

隱藏項目的一般格式包括了規則分類和規則識別項,其中規則識別項包含人們可讀取的 (Human-Readable) 選用規則名稱表示。例如:

[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]

若有絕對的效能原因,而必須將原始檔中隱藏項目的中繼資料最小化,則可以省略規則名稱本身。將規則分類和它的規則 ID 結合,即足以構成唯一的規則識別項。例如:

[SuppressMessage("Microsoft.Design", "CA1039")]

基於維護工作的考量,並不建議使用這個格式。

在方法主體內隱藏多個違規

屬性只能套用至方法,不可內嵌於方法主體中。不過,您可以指定識別項做為訊息 ID,以區別在方法內發生的多次違規。

Imports System

Namespace InSourceSuppression
    Public Class Class1
        <System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", _
        "CA1801:ReviewUnusedParameters", MessageId:="guid")> _
        Shared Function IsValidGuid(ByVal guid As String) As Boolean
            Try
                Return True
            Catch e As ArgumentNullException
            Catch e As OverflowException
            Catch e As FormatException
            End Try

            Return False
        End Function
    End Class
End Namespace
using System;

namespace InSourceSuppression
{
    public class Class1
    {
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
    "CA1806:DoNotIgnoreMethodResults", MessageId = "System.Guid")]
        public static bool IsValidGuid(string guid)
        {
            try
            {
              new Guid(guid); //Causes CA1806: DoNotIgnoreMethodResults
              return true;
            }
            catch (ArgumentNullException) {}
            catch (OverflowException) {}
            catch (FormatException) {}
            return false;
        }
    }
}

產生的程式碼

Managed 程式碼編譯器 (Compiler) 和某些協力廠商工具都會產生程式碼,以協助快速開發程式碼。編譯器產生的程式碼出現在原始程式檔 (Source File) 時,通常都會以 GenerateCodeAttribute 屬性。

您可以選擇是否隱藏來自產生的程式碼之程式碼分析警告和錯誤。如需如何隱藏這種警告和錯誤的詳細資訊,請參閱 Managed 程式碼的程式碼分析屬性

請注意,程式碼分析會忽略套用到整個組件 (Assembly) 或單一參數的 GenerateCodeAttribute,不過這種情況並不常發生。

全域層級的隱藏項目

Managed 程式碼分析工具會檢查套用至組件、模組、型別、成員或參數層級的 SuppressMessage 屬性,也會引發資源和命名空間的違規。這些違規必須套用在全域層級,而且加以指定範圍和目標。例如,下列訊息會隱藏命名空間違規:

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

注意事項:

以命名空間範圍隱藏警告時,只會對命名空間本身隱藏警告,不會對命名空間內的型別隱藏警告。

任何隱藏項目都可以藉由指定明確的範圍來表示。這些隱藏項目必須處於模組層級。您不能藉由裝飾型別來指定成員層級的隱藏項目。

如果訊息參照到編譯器所產生的程式碼,但該程式碼並未對應到明確提供的使用者來源,則您只能使用全域層級的隱藏項目來隱藏這些訊息。例如,下列程式碼會隱藏編譯器發出之建構函式 (Constructor) 的違規:

[module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

注意事項:

目標一律包含完整的項目名稱。

全域隱藏項目檔案

全域隱藏項目檔案會維護全域層級隱藏項目或未指定目標的隱藏項目。例如,組件層次的違規會儲存在這個檔案中。此外,某些 ASP.NET 隱藏項目也會儲存在這個檔案中,因為表單的後置程式碼無法使用專案層級的設定。

請參閱

參考

System.Diagnostics.CodeAnalysis