2012-02-07 43 views
10

我正在使用Crystal Reports进行报告的应用程序。它在ReportDocument对象中打开一个给定的报告,做它需要做的事情然后关闭报告。清理Crystal Reports ReportDocument对象使用的资源的最佳方法是什么?

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

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

测试显示此代码完成了它意味着要做的事情,似乎没有任何问题。我真正建议的问题是,当我执行代码分析(CA)生成报告项目时,我收到以下CA消息:

CA2202:Microsoft.Usage:Object'report'can be在“CrystalReportingProvider.ReportExecute(ReportSourceInformation)”方法中多次处理。为避免生成System.ObjectDisposedException,您不应该在对象上多次调用Dispose。

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

Crystal Reports ReportDocument.Close()方法是否会尽一切努力正确处理资源清理?该消息似乎表明,Close方法调用Dispose方法,但这看起来不正确。

任何意见,将不胜感激。

回答

1

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

+0

这似乎飞在面对的编码惯例,如果你已经完成了一个对象的类型实现IDisposable那么你应该调用Dispose()对它,或者你应该使用一个使用块来做到这一点 – Fooksie 2012-02-08 00:59:23

+0

我检查了程序集并发现Close不会调用Dispose。 – LostInComputer 2017-03-17 03:02:03

3

虽然网上有大量关于正确使用内存以及在任务完成时清理已用内存的信息,例如MSDN:IDisposable.DisposeStackoverflow:Disposing and Setting to null。如果您可以调用Dispose,则会产生主要的编码约定,请执行此操作。

这个约定适用于FileStreams和SqlDataReader等对象,您同时拥有Close和Dispose方法,并调用Dispose调用Close。

我没有考虑到的是“晶体因素”。像他们或厌恶他们,他们做的事情......不同。在第二次回复此SAP SDN article的在线搜索后,SAP员工似乎发布了Close方法的代码。正如您所看到的,在清除并处理组成ReportDocument对象的所有元素之后,它也会调用ReportDocument.Dispose方法。

尽管如此,在不知道Dispose方法如何实现的情况下(正确地假设代码能够以其当前的形式工作),您应该按照适当的约定进行编码并调用Dispose方法或将其声明为使用声明。只要禁止CA警告。

相关问题