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
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.
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.
Đâ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. –
Lưu ý. Cảm ơn. –
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).
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
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ộ. –
nó chỉ phụ thuộc vào cách lớp sử dụng đối tượng trong nội bộ – BlackTigerX
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ề. –
- 1. IDisposable là gì?
- 2. IDisposable Câu hỏi
- 3. Autofac và IDisposable interface
- 4. IDisposable trên một kho tiêm
- 5. Phiên chứa các mục thực hiện IDisposable
- 6. C# sử dụng IDisposable hoặc SafeHandle?
- 7. ClientBase không triển khai thành viên IDisposable
- 8. Thực hiện IDisposable trên lớp kín
- 9. Giao tiếp kế thừa với IDisposable?
- 10. Singleton với finalizer nhưng không IDisposable
- 11. IDisposable, ObjectDisposedException, và các loại an toàn
- 12. thực hiện IDisposable đúng cho mã này
- 13. Tại sao Enumerable.Range triển khai IDisposable?
- 14. Đơn vị công việc, kho và IDisposable
- 15. Nơi đặt thử/nắm bắt khi sử dụng IDisposable
- 16. Bộ sưu tập tiêu chuẩn cho các đối tượng IDisposable
- 17. Tôi có nên triển khai IDisposable cho User Control không?
- 18. System.ServiceModel.ServiceHost triển khai IDisposable nhưng Dispose không công khai
- 19. Làm thế nào để kiểm tra đơn vị IDisposable?
- 20. Xử lý iDisposable trong initializer thất bại hoặc constructor
- 21. Khai báo IDisposable cho lớp hoặc giao diện?
- 22. Phát hiện "bị rò rỉ" đối tượng IDisposable
- 23. Triển khai IDisposable cho lớp chứa chủ đề
- 24. Vấn đề về Flyweight và Factory với IDisposable
- 25. Tôi có nên triển khai IDisposable tại đây không?
- 26. IDisposable: là cần thiết để kiểm tra null vào cuối {}?
- 27. C# IDisposable Sử dụng: Thực hành tốt nhất
- 28. Giao diện IDisposable hoạt động như thế nào?
- 29. Làm thế nào để bạn hòa giải IDisposable và IoC?
- 30. Nên có thể sử dụng được như là tương đương Java cho .NET's IDisposable?
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. –
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ý. –