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