2012-02-07 44 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警告。

相關問題