11

レポートに Crystal Reports を使用するアプリケーションに取り組んでいます。ReportDocument オブジェクトで特定のレポートを開き、必要な処理を行ってから、レポートを閉じます。

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

OpenReport メソッドは、ソース ファイルの検証を行い、開いている ReportDocument オブジェクトを返します。

テストの結果、このコードは本来の目的を果たし、問題はないように見えることが示されました。私が実際にアドバイスを求めている問題は、レポート プロジェクトのコード分析 (CA) ビルドを実行すると、次の CA メッセージが表示されることです。

CA2202 : Microsoft.Usage: オブジェクト 'レポート' は、メソッド 'CrystalReportingProvider.ReportExecute(ReportSourceInformation)' で複数回破棄できます。System.ObjectDisposedException の生成を回避するには、オブジェクトに対して Dispose を複数回呼び出さないでください。

明らかに、コードを変更して、この CA 警告が表示されないようにすることができますが、私の質問はどうすればよいですか?

Crystal Reports の ReportDocument.Close() メソッドは、リソースのクリーンアップを適切に処理するためにすべてのことを行いますか? このメッセージは、Close メソッドが Dispose メソッドを呼び出すことを示しているようですが、それは正しくないようです。

アドバイスをいただければ幸いです。

4

2 に答える 2

3

たとえば、 MSDN:IDisposable.DisposeまたはStackoverflow:Disposing and Setting to null などで、メモリの適切な使用と、それに対応するタスク完了時の使用済みメモリのクリーンアップに関する情報が Web 上で入手できます。これにより、Dispose を呼び出すことができる場合はそうするという一般的なコーディング規則が生まれます。

この規則は、Close メソッドと Dispose メソッドの両方があり、Dispose を呼び出すと Close が呼び出される FileStreams や SqlDataReader (とりわけ) などのオブジェクトに当てはまります。

私が考慮しなかったのは「The Crystal Factor」です。彼らが好きか嫌いか、彼らは物事をします...違う。このSAP SDN記事への2回目の返信でオンラインでさらに多くの検索を行った後、SAPの従業員がCloseメソッドのコードを投稿したようです。ご覧のとおり、ReportDocument オブジェクトを構成するすべての要素をクリアして破棄した後、ReportDocument.Dispose メソッドも呼び出します。

それにもかかわらず、Dispose メソッドがどのように実装されているかを知らなくても (コードが現在の形式で機能することを正しく推測できます)、適切な規則に従ってコーディングし、Dispose メソッドを呼び出すか、Using ステートメントで宣言する必要があります。CA 警告を抑制するだけです。

于 2012-02-08T01:55:53.090 に答える
1

さて、これによると「Close()...レポートで使用されているメモリを解放します。」これは、Close()がDispose()を呼び出すことを示しているため、usingステートメントとClose()の両方を使用するのは冗長です。

于 2012-02-07T20:51:23.690 に答える