c# - CA2213 代码分析规则和自动实现的属性

标签 c# dispose static-analysis fxcop

我在我们的项目中使用静态代码分析来检查代码违规情况。广泛使用的规则之一是 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/

相关文章:

c# - 连接 2 个表的测试记录

c# - 处理迭代器 block 的参数

php - 是否有任何 PHP 静态分析器可以检测不存在的类方法调用?

c++ - 警告——与指针结合的算术表达式中的可疑截断

c# - 在 C# 和 C 之间编码嵌套结构 - 简单的 HelloWorld

C# - 并行 For 循环 : Parallel. For(); - 它们如何处理在它们之外声明的变量?

c# - Wix 无法将自定义操作添加到项目中

c# - 在析构函数中处理对象

c# - 处理套接字/完成两次的问题?

python - 我可以只对更改的代码执行静态分析吗?