清理Crystal Reports ReportDocument对象使用的资源的最佳方法是什么

本文关键字:资源 最佳 方法 是什么 Crystal Reports ReportDocument 对象 清理 | 更新日期: 2023-09-27 18:23:40

我正在开发一个使用Crystal Reports进行报告的应用程序。它打开ReportDocument对象中的给定报告,执行它需要执行的操作,然后关闭该报告。

using (var report = OpenReport(reportSourceInfo))
{
    // Do stuff with the report
    report.Close();
}

OpenReport方法对源文件进行一些验证,并返回一个打开的ReportDocument对象。

测试表明,这段代码完成了它应该做的事情,似乎没有任何问题。我真正寻求建议的问题是,当我对报告项目进行代码分析(CA)构建时,我会收到以下CA消息:

CA2202:Microsoft。用法:在方法"CrystalReportingProvider.ReportExecute(ReportSourceInformation)"中可以多次释放对象"report"。若要避免生成System.ObjectDisposedException,不应对对象多次调用Dispose。

现在很明显,我可以更改代码,这样我就不会收到CA警告,但我的问题是我应该这样做吗?

Crystal Reports ReportDocument.Close()方法是否能够正确处理资源清理?该消息似乎表明Close方法调用Dispose方法,但这似乎并不正确。

如有任何建议,我们将不胜感激。

清理Crystal Reports ReportDocument对象使用的资源的最佳方法是什么

虽然网络上有很多关于正确使用内存以及在任务完成时相应清理已用内存的信息,例如在MSDN上:IDisposable.Dispose或Stackoverflow:Disposing and Setting to null。这就产生了一种流行的编码约定,即如果你可以调用Dispose,那么就这样做

对于FileStreams和SqlDataReader(以及其他对象)这样同时具有Close和Dispose方法的对象,此约定适用,并且调用Dispose会调用Close。

我没有考虑的是"水晶因素"。喜欢或讨厌他们,他们做事。。。不同地在对这篇SAP SDN文章的第二次回复中,一名SAP员工在网上进行了大量搜索后,似乎发布了Close方法的代码。正如您所看到的,在清除并处理了组成ReportDocument对象的所有元素之后,它还会调用ReportDocument.Dispose方法。

尽管如此,在不知道Dispose方法是如何实现的情况下(正确地假设代码以当前形式工作),您应该按照正确的约定进行编码,并调用Dispose方法或在Using语句中声明它。只需取消CA警告。

根据这个,"Close()…释放报表使用的内存。"这表明Close(。