在我们的网站上,我们有一些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()
方法吗?
由于
答案 0 :(得分:0)
using语句只是一种避免`try {...} finally {disposable.Dispose();的样板代码的方法。阻止。
在您的示例中,两个代码段不相同 - using语句版本放弃了对关闭流的调用(尽管此示例中Close
和Dispose
之间的差异应为nill)。如果您的第一个示例中出现异常,您将不会关闭或处置报告和/或流。我建议使用第二个版本(使用using语句) - 它们可以在适当的时候更容易地正确处理事物。
最有可能的是,示例编写者不熟悉C#的功能,并且省略了using语句,以使示例在所有语言中尽可能相似。