次の方法で共有


インスタンス化されない内部クラスを作成しないでください

更新 : 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.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();
    

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

関連規則

呼び出されないプライベート コードを作成しないでください

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

使用されていないローカル変数を削除します。