我在我们的项目中使用静态代码分析来检查代码违规情况。广泛使用的规则之一是 CA2213,它检查一次性字段的正确处理。
我注意到 CA2213 不检查自动实现属性的处理。
此外,如果类继承自实现 IDisposable 的类且未重写 Dispose 方法,则 CA2213 既不检查字段也不检查自动实现的属性的处置。
实例:
public sealed class Good : IDisposable {
private Font font;
public Font Font {
get { return font; }
set { font = value; }
}
public Good() { font = new Font("Arial", 9); }
public void Dispose() { /* Do nothing */ } // CA2213
}
public sealed class Bad : IDisposable {
public Font Font { get; set; }
public Bad() { Font = new Font("Arial", 9); }
public void Dispose() { /* Do nothing */ } // No warning
}
有没有其他人遇到过这种行为?这是设计使然还是 CA2213 规则中的错误?
最佳答案
代码分析器确实有局限性,此代码中存在的一个是它需要生成可操作的警告。程序员可以实际跟进以修复他的代码的一个。当前代码分析器的一个关键问题是它不分析源代码,它从编译器生成的程序集开始工作。这很好,它适用于任何 .NET 语言。但是没有人会喜欢这个警告:
CA2213 Disposable fields should be disposed
'Bad' contains field<Font>k__BackingField
that is of IDisposable type: 'Font'. Change the Dispose method on 'Bad' to call Dispose or Close on this field.
哎呀,程序中当然没有这个字段。为了生成更好的消息,分析器必须弄清楚 <Font>k__BackingField
元数据中的字段实际上与自动实现的 Font
相关联属性(property)。元数据中没有任何东西可以明确地建立这种联系。该字段仅带有 [CompilerGenerated] 属性,自动生成的字段名称是编译器实现细节。不同的语言编译器生成不同的名称。
这种问题需要源代码分析,而不是目前实现的 IL 分析。机会在敲门,使用今天可用的 Roslyn 可以更容易地实现源代码分析。 VS2015是第一个支持“Live Code”分析的VS版本。我还不知道它是否会很快查找 CA2213 样式错误。
关于c# - CA2213 代码分析规则和自动实现的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26625062/