CA1812:避免未实例化的内部类
属性 | 值 |
---|---|
规则 ID | CA1812 |
标题 | 避免未实例化的内部类 |
类别 | “性能” |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 9 中默认启用 | 否 |
原因
永远不会实例化内部(程序集级别)类型。
规则说明
此规则尝试查找对该类型其中一个构造函数的调用,并在找不到调用时报告冲突。
此规则不会检查以下类型:
- 值类型
- 抽象类型
- 枚举
- 委托
- 编译器发出的数组类型
- 无法实例化且仅定义
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 开始可用。