CA1812:インスタンス化されていない内部クラスを使用しません

プロパティ
ルール ID CA1812
Title インスタンス化されていない内部クラスを使用しません
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 いいえ

原因

内部 (アセンブリ レベル) 型はインスタンス化されません。

規則の説明

この規則は、型のいずれかのコンストラクターへの呼び出しを検索し、呼び出しが見つからない場合に違反を報告します。

この規則では、次の型は検証されません。

  • 値型
  • 抽象型
  • 列挙
  • 代理人
  • コンパイラによって出力された配列型
  • インスタンス化できず、static メソッドのみを定義する型。

System.Runtime.CompilerServices.InternalsVisibleToAttribute を分析対象のアセンブリに適用する場合、フィールドはフレンド アセンブリによって使用される可能性があるため、この規則は既定では、internal (Visual Basic では Friend) としてマークされている型にフラグを設定しません。 いずれにしてもアセンブリを分析するには、「分析するコードを構成する」を参照してください。

違反の修正方法

この規則の違反を修正するには、型を削除するか、その型を使用するコードを追加します。 型に static メソッドのみが含まれている場合は、static 修飾子を型に追加して、コンパイラが既定のパブリック インスタンス コンストラクターを生成しないようにします。

どのようなときに警告を抑制するか

この規則による警告を抑制しても問題ありません。 次の状況では、この警告を抑制することをお勧めします。

  • System.Activator.CreateInstance などの遅延バインディングされたリフレクション メソッドを使用してクラスが作成されます。

  • クラスは、依存関係の挿入パターンの一部として制御の反転 (IoC) コンテナーに登録されます。

  • ランタイムまたは ASP.NET によって自動的にクラスが作成されます。 自動的に作成されるクラスの例として、System.Configuration.IConfigurationSectionHandler または System.Web.IHttpHandler を実装するクラスがあります。

  • クラスはクラス定義の型パラメーターとして使われ、new 制約があります。 次の例は、規則 CA1812 によってフラグが設定されます。

    internal class MyClass
    {
        public void DoSomething()
        {
        }
    }
    public class MyGeneric<T> where T : new()
    {
        public T Create()
        {
            return new T();
        }
    }
    
    MyGeneric<MyClass> mc = new MyGeneric<MyClass>();
    mc.Create();
    

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA1812
// The code that's violating the rule is on this line.
#pragma warning restore CA1812

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA1812.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。

分析するコードを構成する

次のオプションを使用して、コードベースのどの部分に対してこの規則を実行するか構成します。

このオプションを構成できる対象は、この規則だけ、それを適用するすべての規則、それを適用するこのカテゴリ (パフォーマンス) のすべての規則のいずれかです。 詳細については、「コード品質規則の構成オプション」を参照してください。

InternalsVisibleTo 属性を無視する

既定では、分析対象のアセンブリがその内部シンボルを公開するために InternalsVisibleToAttribute を使用している場合、この規則は無効になります。 アセンブリが InternalsVisibleToAttribute によってマークされていても規則を実行するように指定するには、自分のプロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.ignore_internalsvisibleto = true

このオプションは、.NET 8 以降で使用できます。