Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 清理Crystal Reports ReportDocument对象使用的资源的最佳方法是什么?_C#_Crystal Reports_Code Analysis_Idisposable_Reportdocument - Fatal编程技术网

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

C# 清理Crystal Reports ReportDocument对象使用的资源的最佳方法是什么?,c#,crystal-reports,code-analysis,idisposable,reportdocument,C#,Crystal Reports,Code Analysis,Idisposable,Reportdocument,我正在开发一个使用Crystal Reports进行报告的应用程序。它在ReportDocument对象中打开给定的报表,执行需要执行的操作,然后关闭报表 using (var report = OpenReport(reportSourceInfo)) { // Do stuff with the report report.Close(); } OpenReport方法对源文件进行一些验证,并返回一个OpenReportDocument对象 测试表明,这段代码完成了它的任务

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

using (var report = OpenReport(reportSourceInfo))
{
    // Do stuff with the report
    report.Close();
}
OpenReport方法对源文件进行一些验证,并返回一个OpenReportDocument对象

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

CA2202:Microsoft。用法:对象“report”可以在方法“CrystalReportingProvider.ReportExecute(ReportSourceInformation)”中多次释放。为了避免生成System.ObjectDisposedException,您不应该对对象多次调用Dispose

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

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


任何建议都将不胜感激。

根据“Close()…释放报告使用的内存。”这将表明Close()调用Dispose(),因此既有using语句又有Close()是多余的.

而网络上有大量关于正确使用内存以及任务完成时相应清理已用内存的信息,例如在或。这就产生了流行的编码惯例,即如果可以调用Dispose,那么就这样做

此约定适用于FileStreams和SqlDataReader等对象,其中您同时拥有Close和Dispose方法,并且调用Dispose调用Close

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


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

这似乎与编码约定背道而驰,即如果您已经完成了一个类型实现IDisposable的对象,那么您应该对其调用Dispose(),或者您应该使用using块来执行此操作。我检查了程序集,发现Close没有调用Dispose。