2009-08-31 25 views
5

Nếu tôi triển khai đối tượng có IDisposable, tất cả các đối tượng sở hữu đối tượng đó cũng sẽ triển khai đối tượng đó, ngay cả khi chúng không có tài nguyên khác để giải phóng?Chuỗi IDisposable

Trả lời

12

Có. Bạn cần phải vứt bỏ chúng, để các biến thành viên của bạn được xử lý đúng cách.

Bất cứ khi nào bạn đóng gói một lớp IDisposable, bạn nên làm cho lớp của bạn IDisposable. Trong phương pháp Vứt bỏ của bạn, bạn nên vứt bỏ các tài nguyên được đóng gói của mình. Về cơ bản, đối xử với họ giống như cách bạn sẽ đối xử với một nguồn gốc.

+0

Chỉ bạn không thể giả định thứ tự mà các đối tượng được xử lý, nếu được tạo ra bởi luồng kết thúc GC. –

+0

True -but Tôi không chắc chắn điều này có liên quan như thế nào. Nếu bạn bọc lớp của bạn và làm cho nó dùng một lần, bạn CÓ THỂ kiểm soát thứ tự mà mỗi tài nguyên đóng gói được xử lý. –

1

Nếu bạn muốn xử lý xác định, cuối cùng một số khách hàng cần gọi Dispose hoặc kết thúc cuộc gọi trong khối "đang sử dụng". Để nhỏ xuống đối tượng của bạn, điều đó có thể yêu cầu chủ sở hữu cũng triển khai IDisposable.

Bạn không nên dựa vào bộ thu gom rác để giải phóng mọi tài nguyên phụ thuộc vào thời gian.

+0

Đây không phải là vấn đề tài nguyên không được quản lý. Các đối tượng sở hữu tài nguyên không được quản lý sẽ 1) sử dụng 'SafeHandle's hoặc 2) sử dụng trình hoàn thiện do người dùng xác định để giải phóng tài nguyên không được quản lý. Mặc dù điều này không xác định, bộ thu gom rác * có thể phát hành đúng các tài nguyên không được quản lý. Lợi ích chính của chuỗi 'IDisposable' thích hợp là" đóng "kịp thời," kết thúc "hoặc" phát hành "các tài nguyên nhạy cảm với vấn đề, chẳng hạn như (nhưng chắc chắn không giới hạn) I/O. –

+0

Lưu ý. Cảm ơn. –

1

Có, lớp sở hữu nên triển khai IDisposable nhưng không cần (không nên có) Trình hoàn tất (trình hủy).

1

nop, họ chỉ cần sử dụng lớp đó với một "sử dụng" tuyên bố chắc chắn rằng họ định đoạt đối tượng đó đúng, nhưng các đối tượng bản thân không cần phải thực hiện IDisplosable

+0

Nếu một lớp khác sở hữu một đối tượng dùng một lần, nó cũng nên thực hiện IDisposable. Nếu không, lớp sở hữu không có cách nào để cho phép người gọi để xử lý nó, và do đó, các nguồn lực dùng một lần nó sở hữu nội bộ. –

+0

nó chỉ phụ thuộc vào cách lớp sử dụng đối tượng trong nội bộ – BlackTigerX

+0

Tôi sử dụng từ "riêng" cụ thể để có nghĩa là "có biến thành viên của loại được chỉ định", vì vậy không có điều này không hoạt động. Tôi sử dụng tác phẩm "sử dụng" cho những gì bạn đang nói về. –

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