知道调用方法是否应释放被调用方法返回的对象的任何方法

本文关键字:方法 调用 返回 任何 对象 是否 释放 | 更新日期: 2023-09-27 18:31:31

有没有办法标记一个方法,以便代码分析或构建给出错误消息来处置方法返回的对象。 例如在下面的方法中。

  private void chart1_Click(object sender, EventArgs e)
    {
        Brush sb = GetBlackBrush();
    }
    Brush GetBlackBrush()
    {
        SolidBrush sb = new SolidBrush(Color.Black);
        return sb;
    }

每当任何名为 GetBlackBrush 的方法在 VS2010 中构建解决方案时,我都应该收到代码分析警告或构建错误或构建警告,以指示我需要释放 Brush 对象。我希望我应该在 chart1_Click() 方法中获得一些指示来处理画笔对象。

这只是一个示例代码,我知道我们应该使用"使用",但这是解决方案。

有一个 CA2213 代码分析警告,但对于此特定示例,不会调用该警告。

知道调用方法是否应释放被调用方法返回的对象的任何方法

CA2000 警告是您可能想要的,请参阅文档:

如果一次性物品未在所有之前明确处理 对它的引用超出了范围,该对象将在某些时候被释放 垃圾回收器运行终结器时的不确定时间 对象。因为可能会发生异常事件,这将阻止 对象的终结器从运行中,该对象应该是 改为显式释放。

不确定您是否可以将其标记为错误,但它应该拾取它。您可能还希望启用 CA2213

没有特定的约定来指示哪些方法转移IDisposable对象的所有权,框架本身在这方面相当不一致。 如果某个方法创建并返回对新SolidBrush的引用,而不保留该引用的副本,则该画笔的接收者应释放它。 相反,如果该方法执行以下操作:

WeakReference<Brush> myBrush = new WeakReference<Brush>(); // Field of class hosting method
Brush GetBlackBrush()
{
  Brush ret = myBrush.Target;
  if (ret == null)
  {
    ret = new SolidBrush(Color.Black);
    myBrush.Target = ret;
  }
}

然后正确性将指示接收方不要在它收到的对象上调用Dispose[使用弱引用将确保在任何时候,上面的代码只会泄漏一个额外的SolidBrush对象;如果调用者放弃实例而不释放它,那么通常GC不会注意到该实例已被放弃(在这种情况下,下一个调用者将收到同一个),或者它已经清理干净了。 在任何一种情况下,一次只存在一个废弃的画笔实例。 此外,在myBrush持有对它的引用时在刷实例上调用Dispose会破坏GetBlackBrush()的下一个调用方。