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

我正在开发一个使用Crystal Reports进行报告的应用程序。 它在ReportDocument对象中打开一个给定的报告,完成它需要做的事情然后关闭报告。

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

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

测试表明,此代码完成了它的意图并且似乎没有任何问题。 我真正建议的问题是当我进行报告项目的代码分析(CA)构建时,我得到以下CA消息:

CA2202:Microsoft.Usage:对象’report’可以在方法’CrystalReportingProvider.ReportExecute(ReportSourceInformation)’中多次处理。 为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose。

现在显然我可以改变代码,所以我没有得到这个CA警告,但我的问题是我应该吗?

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

任何意见,将不胜感激。

好吧,根据这个 ,“Close()…释放[s]报告使用的内存。” 这表明Close()调用Dispose(),因此同时使用using语句和Close()将是多余的。

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

此约定适用于FileStreams和SqlDataReader(以及其他)的对象,其中包含Close和Dispose方法,并且调用Dispose调用Close。

我没有考虑的是“水晶因子”。 喜欢他们或厌恶他们,他们做事……不同。 在对SAP SDN文章的第二次回复中进行了更多的在线搜索之后,SAP员工似乎发布了Close方法的代码。 如您所见,在清除和处理构成ReportDocument对象的所有元素之后,它也会调用ReportDocument.Dispose方法。

尽管如此,并且在不知道Dispose方法是如何实现的情况下(正确地说,因为代码确实以其当前forms工作),您应该编写适当的约定并调用Dispose方法或在Using语句中声明它。 只需禁止CA警告。