避免未实例化的内部类
更新:2007 年 11 月
TypeName |
AvoidUninstantiatedInternalClasses |
CheckId |
CA1812 |
类别 |
Microsoft.Performance |
是否重大更改 |
否 |
原因
程序集级别类型的实例不是由程序集中的代码创建的。
规则说明
该规则试图定位对类型的某个构造函数的调用,如果找不到调用,则报告冲突。
该规则不能检查下列类型:
值类型
抽象类型
枚举
委托
编译器发出的数组类型
不能实例化并且只定义 static 方法的类型。
如果将 System.Runtime.CompilerServices.InternalsVisibleToAttribute 应用于正在分析的程序集,此规则不会在标记为 internal 的任何构造函数上激发,这是因为无法判断字段是否正由其他 friend 程序集使用。
虽然无法在 Visual Studio 代码分析中解决此限制,但如果每个 friend 程序集都存在于分析中,外部独立 FxCop 将在内部构造函数上激发。
如何修复冲突
要修复与该规则的冲突,请移除该类型,或添加使用该类型的代码。如果类型只包含静态方法,为类型添加下列属性之一可以防止编译器发出默认公共实例构造函数:
私有构造函数(对于面向 .NET Framework 1.0 和 1.1 版的类型)。
static 修饰符(对于面向 .NET Framework 2.0 的类型)。
何时禁止显示警告
可以安全地禁止显示与此规则有关的警告。建议在下列情况下禁止显示此警告:
类是通过后期绑定反射方法创建的,例如 CreateInstance。
类是由运行库或 ASP.NET 自动创建的。例如,实现 System.Configuration.IConfigurationSectionHandler 或 System.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();
在这些情况下,建议禁止显示此警告。