可以和ExportToStream一起使用吗?

时间:2015-08-13 11:43:18

标签: c# asp.net crystal-reports

在我们的网站上,我们有一些Crytal报告。将报告发送给用户的代码将导出为Stream:

MyReport report = new MyReport();
report.SetDataSource(myData);

Stream reportStream = report.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, localFilename);

SendReportToUser(reportStream)            

reportStream.Close();
reportStream.Dispose();

report.Close();
report.Dispose();

我的问题是我可以替换下一个代码吗?使用using并避免调用流Close()Dispose()方法?

using (var report = new MyReport();)
{
     report.SetDataSource(myData);

     using (var reportStream = report.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, localFilename)
     {
          SendReportToUser(reportStream)            
     }
}

我知道CrystalReport实现了它自己的Stream FileStreamDeleteOnClose版本,我一直在互联网上查看,似乎每个人都避免使用using,而不是调用Close()和{ {1}}生成的流。

是什么原因? Crystal报告了一些内存泄漏,我必须始终调用生成的Stream的Dispose()Close()方法吗?

由于

1 个答案:

答案 0 :(得分:0)

using语句只是一种避免`try {...} finally {disposable.Dispose();的样板代码的方法。阻止。

在您的示例中,两个代码段不相同 - using语句版本放弃了对关闭流的调用(尽管此示例中CloseDispose之间的差异应为nill)。如果您的第一个示例中出现异常,您将不会关闭或处置报告和/或流。我建议使用第二个版本(使用using语句) - 它们可以在适当的时候更容易地正确处理事物。

最有可能的是,示例编写者不熟悉C#的功能,并且省略了using语句,以使示例在所有语言中尽可能相似。