共用方式為


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

更新:2007 年 11 月

型別名稱

AvoidUninstantiatedInternalClasses

CheckId

CA1812

分類

Microsoft.Performance

中斷變更

非中斷

原因

組件層級 (Assembly-level) 型別的執行個體 (Instance) 不是由組件中的程式碼所建立。

規則描述

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

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

  • 實值型別

  • 抽象型別

  • 列舉型別

  • 委派

  • 編譯器發出的陣列型別

  • 無法執行個體化並只有定義 static 方法的型別。

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

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

如何修正違規

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

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

  • 以 .NET Framework 2.0 為目標的型別 static 修飾詞。

隱藏警告的時機

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

  • 類別是透過 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();
    

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

相關規則

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

請檢查未使用的參數

移除未使用的區域變數