CA1812: インスタンス化されていない内部クラスを使用しないでください
TypeName |
AvoidUninstantiatedInternalClasses |
CheckId |
CA1812 |
分類 |
Microsoft.Performance |
互換性に影響する変更点 |
なし |
原因
アセンブリ レベルの型のインスタンスが、アセンブリ内のコードから作成されません。
規則の説明
この規則では、型のコンストラクターのいずれかに対する呼び出しの位置を検索し、呼び出しが見つからない場合は違反をレポートします。
次の型は、この規則でチェックされません。
値型
抽象型
列挙型
デリゲート
コンパイラから出力された配列型
static (Visual Basic では Shared) メソッドのみを定義するインスタンス化できない型
分析対象のアセンブリに InternalsVisibleToAttribute を適用する場合は、別の friend アセンブリでフィールドが使用されているかを判断できないため、この規則は internal としてマークされたコンストラクターには適用されません。
Visual Studio コード分析ではこの制限を回避できませんが、すべての friend アセンブリが分析に含まれる場合は、外部のスタンドアロン FxCop が内部コンストラクターに対して実行されます。
違反の修正方法
この規則違反を修正するには、その型を削除するか、その型を使用するコードを追加します。型に静的メソッドのみが含まれる場合、次のいずれかを型に追加して、コンパイラから既定のパブリック インスタンス コンストラクターが出力されないようにします。
プライベート コンストラクター (.NET Framework Version 1.0 および 1.1 を対象にした型の場合)
static (Visual Basic では Shared) 修飾子 (.NET Framework 2.0 を対象にした型の場合)
警告を抑制する状況
この規則による警告を抑制しても安全です。次の場合は、この警告を抑制することを勧めします。
クラスが、CreateInstance などの遅延バインディング リフレクション メソッドで作成されている。
クラスまたは ASP.NETがランタイムによって自動的に作成されます。たとえば、IConfigurationSectionHandler または 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();
このような場合は、この警告を抑制することを勧めします。