CA1812错误警告:“;显然从未实例化的内部类&”;
本文关键字:实例化 内部类 警告 错误 CA1812 | 更新日期: 2023-09-27 18:27:40
我收到一个代码分析警告,似乎是假阳性。
CA1812:Microsoft.Performance:"MyClass.MyPrivateClass"是一个内部类,显然从未实例化。如果是,请从程序集中删除代码。如果此类只包含静态方法,请考虑添加一个私有构造函数,以防止编译器生成默认构造函数。
如何摆脱此警告?我宁愿不抑制警告,除非我确信我无法避免。
类看起来像这样:
namespace Some.Namespace
{
public class MyClass
{
private class MyPrivateClass
{
public int Id { get; set; }
public ModelObject { get; set; }
}
}
}
我是这样使用的:
private IQueryable<MyPrivateClass> GetMyPrivateClasses()
{
return this.Repository().All()
.Select(m => new MyPrivateClass { Id = m.Id, ModelObject = m };
}
这种用法不算实例化吗?
我想它正在检查IL;实际上,IL从不包含new MyPrivateClass
指令,因为该语句可能是针对IQueryable<T>
运行的,因此lambda是一个表达式树。它将包含一些Expression.New
和一些typeof(MyPrivateClass)
-但不包含new MyPrivateClass
。
在这种情况下,错误具有误导性。只需抑制即可。
仅供参考,此警告有一个新的文档页面:
https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1812
类的实例化并不总是能被分析器识别。
如果合理,则取消此警告:
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses", Justification = "generic/late bound/reflection")]
尤其发生在Net.Core中。
将类更改为内部类或公共类,即可解决问题。不管怎样,你可以从外部类中提取你的内部类。。。