次の方法で共有


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();
    

このような場合は、この警告を抑制することを勧めします。

関連規則

CA1811: 呼び出されていないプライベート コードを使用しません

CA1801: 使用されていないパラメーターを再確認します

CA1804: 使用されていないローカルを削除します