2012-02-07 33 views
10

Tôi đang làm việc trên một ứng dụng sử dụng Crystal Reports cho báo cáo. Nó sẽ mở ra một báo cáo nhất định trong một đối tượng ReportDocument, làm những gì nó cần làm và sau đó đóng báo cáo.Cách tốt nhất để dọn dẹp tài nguyên được sử dụng bởi đối tượng Crystal Reports ReportDocument là gì?

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

Phương thức OpenReport thực hiện xác thực một số tệp nguồn và trả về đối tượng ReportDocument mở.

Thử nghiệm đã cho thấy rằng mã này thực hiện những gì nó có nghĩa là để làm và dường như không có vấn đề. Vấn đề tôi thực sự sau khi tư vấn là khi tôi thực hiện phân tích mã (CA) của dự án báo cáo, tôi nhận được thông báo CA sau:

CA2202: Microsoft.Usage: Object 'report' có thể xử lý nhiều hơn một lần trong phương thức 'CrystalReportingProvider.ReportExecute (ReportSourceInformation)'. Để tránh tạo ra một System.ObjectDisposedException bạn không nên gọi Dispose nhiều hơn một lần trên một đối tượng.

Bây giờ rõ ràng là tôi có thể thay đổi mã xung quanh để không nhận được cảnh báo CA này, nhưng câu hỏi của tôi là phải không?

Phương thức báo cáo Crystal ReportDocument.Close() có làm mọi thứ để xử lý dọn dẹp tài nguyên đúng cách không? Thông báo dường như chỉ ra rằng phương thức Close gọi phương thức Dispose, nhưng điều đó dường như không đúng.

Mọi lời khuyên sẽ được đánh giá cao.

Trả lời

1

Vâng, theo this, "Đóng() ... phát hành [s] bộ nhớ được sử dụng bởi báo cáo." Điều đó sẽ chỉ ra rằng Close() gọi Dispose(), do đó, nó sẽ là dư thừa để có cả một câu lệnh using và Close().

+0

Điều đó dường như bay khi đối mặt với quy ước mã hóa rằng nếu bạn đã hoàn thành với một đối tượng có loại thực hiện IDisposable thì bạn nên gọi Dispose() trên nó, cách khác bạn nên sử dụng khối sử dụng để thực hiện điều này – Fooksie

+0

Tôi đã kiểm tra lắp ráp và thấy rằng Close không gọi Dispose. – LostInComputer

3

Mặc dù có rất nhiều thông tin sẵn có trên web liên quan đến việc sử dụng bộ nhớ phù hợp và dọn sạch bộ nhớ đã sử dụng tương ứng khi hoàn thành nhiệm vụ, tại MSDN:IDisposable.Dispose hoặc Stackoverflow:Disposing and Setting to null chẳng hạn. Điều này làm phát sinh quy ước mã hóa hiện hành nếu bạn có thể gọi Dispose, sau đó làm như vậy.

Quy ước này đúng đối với các đối tượng như FileStreams và SqlDataReader (trong số những người khác), nơi bạn có cả hai phương pháp Đóng và Vứt bỏ và gọi Vứt bỏ cuộc gọi Đóng.

Điều tôi không tính đến là "Yếu tố tinh thể". Giống như họ hoặc ghét họ, họ làm mọi thứ ... khác nhau. Sau khi LOT tìm kiếm trực tuyến nhiều hơn trong câu trả lời thứ hai cho số SAP SDN article, nhân viên SAP dường như đăng mã của phương thức Đóng. Như bạn có thể thấy, sau khi xóa và xử lý tất cả các phần tử bao gồm đối tượng ReportDocument, nó cũng gọi phương thức ReportDocument.Dispose. Mặc dù tất cả những điều đó, và không biết phương pháp Dispose được thực hiện như thế nào (đúng cách bạn sẽ giả định là mã hoạt động dưới dạng hiện tại của nó), bạn nên viết mã cho quy ước thích hợp và gọi phương thức Vứt bỏ hoặc khai báo nó trong một Sử dụng câu lệnh. Chỉ cần chặn cảnh báo CA.

Các vấn đề liên quan