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.IConfigurationSectionHandler 或 System.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();
在這些情況中,建議您隱藏這個警告。