c# - 代码分析 CA1063 在从 IDisposable 派生并在基类中提供实现时触发

标签 c# code-analysis idisposable

我有一些代码会触发代码分析警告 CA1063:

CA1063 : Microsoft.Design : Remove IDisposable from the list of interfaces implemented by 'Functionality' and override the base class Dispose implementation instead.

但是,我不确定我需要做什么来修复这个警告。

简而言之,我有一个派生自IDisposable 的接口(interface)IFunctionality。类 Functionality 实现了 IFunctionality 但派生自类 Reusable 以便能够重用 som 代码。 Reusable 类也派生自 IDisposable

public class Reusable : IDisposable {

  ~Reusable() {
    Dispose(false);
  }

  public void Dispose() {
    Dispose(true);
    GC.SuppressFinalize(this);
  }

  protected virtual void Dispose(Boolean disposing) {
    // ...
  }

  public void DoSomething() {
    // ...
  }

}

public interface IFunctionality : IDisposable {

  void DoSomething();

  void DoSomethingElse();

}

public class Functionality : Reusable, IFunctionality {

  public void DoSomethingElse() {
    // ...
  }

#if WORK_AROUND_CA1063
  // Removes CA1063
  protected override void Dispose(Boolean disposing) {
    base.Dispose(disposing);
  }
#endif

}

我可以通过覆盖 Functionality 上的 Dispose 并调用基类 Dispose 来消除警告,即使这样做不会改变代码的语义。

那么在这种情况下我是否忽略了有关 IDisposable 的某些内容,或者只是 CA1063 对这个特定的构造失灵了?

我知道我可以抑制 CA1063,但该规则非常宽泛,我不想错过实现此规则报告的 IDisposable 的任何其他问题。

最佳答案

由于规则本身的一个小错误,这是一个误报。当试图弄清楚一个类是否重新实现 IDisposable 时(在弄清楚有一个可以覆盖的基类实现之后),它只查看类的接口(interface)是否包含 IDisposable。不幸的是,显示在程序集元数据中的接口(interface)列表包括接口(interface)的“分解”列表,包括通过类在原始 C# 代码中显式实现的接口(interface)继承的任何接口(interface)。这意味着 FxCop 看到的声明类似于您的 Functionality 类:

public class Functionality : Reusable, IFunctionality, IDisposable
{
    ...
}

鉴于此元数据表示,ImplementIDisposableCorrectly 规则在尝试确定类是否实际重新实现 IDisposable 方面应该更加智能(例如,如果基类具有一个可重写的 Dispose(bool))。但是,鉴于规则不这样做,您最好的方法是抑制误报。

顺便说一句,我建议认真考虑使用 SuppressMessageAttribute用于抑制误报而不是您当前的条件编译方法。例如:

[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
    Justification = "False positive.  IDisposable is inherited via IFunctionality.  See http://stackoverflow.com/questions/8925925/code-analysis-ca1063-fires-when-deriving-from-idisposable-and-providing-implemen for details.")]
public class Functionality : Reusable, IFunctionality
{
    ...
}

此外,您可能需要认真考虑 getting rid of the finalizer ...

关于c# - 代码分析 CA1063 在从 IDisposable 派生并在基类中提供实现时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8925925/

相关文章:

c++ - 寻找免费的源代码分析器(函数依赖树)

c#-4.0 - 与 IDisposable 混淆

c# - radiobuttons - 测试是否选中 - 为什么前两种方法失败?

c# - Umbraco 从另一个站点登录

code-analysis - 如何在 Visual Studio 2012 中创建和引用自定义代码分析规则?

version-control - 查找和衡量修改最多的代码的工具?

C# 将 block 与引用 IDisposable 对象的匿名方法一起使用

c# - 在 Entity Framework 4 中处理对象上下文

c# - 读取 Cobol 生成的文件

c# - .NET 内存泄漏