共用方式為


CA1812:避免使用未執行個體化的內部類別

型別名稱

AvoidUninstantiatedInternalClasses

CheckId

CA1812

分類

Microsoft.Performance

中斷變更

中斷

原因

組件層級型別的執行個體不是由組件中的程式碼所建立。

規則描述

此規則會嘗試找出其中一個型別建構函式的呼叫,並且在找不到呼叫時報告違規。

此規則不會檢查下列型別:

  • 實值型別

  • 抽象型別

  • 列舉型別

  • 委派

  • 編譯器發出的陣列型別

  • 無法執行個體化且只有定義 static (在 Visual Basic 中為 Shared) 方法的型別。

如果將 System.Runtime.CompilerServices.InternalsVisibleToAttribute 套用到要分析的組件,在任何標記為 internal 的建構函式上都不會引發這個規則,因為您無法得知某個欄位是否正由另一個 friend 組件所使用。

即使您無法在 Visual Studio 程式碼分析中解決這個限制,但如果每個 friend 組件都有在分析中,外部的獨立 FxCop 將會在內部建構函式上引發。

如何修正違規

若要修正此規則的違規情形,請移除型別或加入使用此型別的程式碼。 如果型別只包含靜態方法,請將下列其中一項加入至型別,以防止編譯器發出預設公用執行個體建構函式:

  • 以 .NET Framework 1.0 和 1.1 版為目標的型別私用建構函式。

  • 以 .NET Framework 2.0 為目標之型別的 static (在 Visual Basic 中為 Shared) 修飾詞。

隱藏警告的時機

您可以放心地隱藏這項規則的警告。 建議您在下列情況中隱藏這個警告:

  • 類別是透過 CreateInstance 這類的晚期繫結反映 (Reflection) 方法而建立的。

  • 執行階段或 ASP.NET 會自動建立這個類別。例如,實作 System.Configuration.IConfigurationSectionHandlerSystem.Web.IHttpHandler 的類別。

  • 類別是以泛型型別參數傳遞並具有新的條件約束。 例如,下列範例會引發這個規則。

    internal class MyClass
    {   
        public DoSomething()   
        {
        }
    } 
    public class MyGeneric<T> where T : new()
    {
        public T Create()
        {
            return new T();   
        }
    }
    // [...] 
    MyGeneric<MyClass> mc = new MyGeneric<MyClass>();
    mc.Create();
    

在這些情況中,建議您隱藏這個警告。

相關規則

CA1811:避免使用未呼叫的私用程式碼

CA1801:必須檢視未使用的參數

CA1804:必須移除未使用的區域變數