CA1812:避免未实例化的内部类

属性
规则 ID CA1812
标题 避免未实例化的内部类
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

永远不会实例化内部(程序集级别)类型。

规则说明

此规则尝试查找对该类型其中一个构造函数的调用,并在找不到调用时报告冲突。

此规则不会检查以下类型:

  • 值类型
  • 抽象类型
  • 枚举
  • 委托
  • 编译器发出的数组类型
  • 无法实例化且仅定义 static 方法的类型。

如果将 System.Runtime.CompilerServices.InternalsVisibleToAttribute 应用于正在分析的程序集,那么此规则不会标记默认标记为 internal在 Visual Basic 中为 Friend)的类型,因为友元程序集可能会使用字段。 若要分析程序集,请参阅配置要分析的代码

如何解决冲突

若要解决此规则的冲突,请删除类型或添加使用该类型的代码。 如果类型仅包含 static 方法,请将 static 修饰符添加到类型,以阻止编译器生成默认的公共实例构造函数。

何时禁止显示警告

禁止显示此规则的警告是安全的。 建议在以下情况时取消显示此警告:

  • 类通过后期绑定反射方法(如 System.Activator.CreateInstance)创建。

  • 该类在控制反转 (IoC) 容器中注册为依赖项注入模式的一部分 。

  • 类由运行时或 ASP.NET 自动创建。 自动创建的类的示例包括实现 System.Configuration.IConfigurationSectionHandlerSystem.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 开始可用。