Có rất nhiều câu hỏi SO hỏi làm thế nào để phát hiện các đối tượng IDisposable bị rò rỉ. Có vẻ như câu trả lời là "you can't".Phát hiện "bị rò rỉ" đối tượng IDisposable
Tôi vừa kiểm tra với trường hợp kiểm tra tầm thường nhất, rằng FxCop 10.0 không làm điều đó, ReSharper 4 với MSVS2010 không làm điều đó.
Điều này có vẻ sai với tôi, tệ hơn rò rỉ bộ nhớ trong C (ít nhất chúng tôi đã thiết lập các công cụ để phát hiện). Tôi đã suy nghĩ: Liệu có thể, bằng cách sử dụng sự phản chiếu và các kỹ thuật tiên tiến khác mơ hồ, mà tôi có thể tiêm một kiểm tra vào thời gian chạy, trong finalizer để xem liệu Dispose
đã được gọi là bao nhiêu chưa? Có phải không?
Làm thế nào về các thủ thuật ảo với WinDBG + SOS?
Thậm chí nếu không có công cụ hiện có để thực hiện điều đó, tôi muốn biết liệu điều này có thể về mặt lý thuyết (C# của tôi không phải là rất sắc nét).
Ý tưởng?
LƯU Ý Tiêu đề của câu hỏi này có thể gây hiểu nhầm. Câu hỏi thực sự ở đây phải là đối tượng IDisposable
có là Disposed()
đúng cách không. Việc xử lý GC không được tính vì tôi coi đó là một sai lầm.
Chỉnh sửa: Giải pháp: .NET Memory Profiler thực hiện công việc. Chúng tôi chỉ cần spam một số GC.Collect()
ở cuối chương trình để cho phép trình thu thập thông tin của chúng tôi thu thập chính xác số liệu thống kê.
Lý do tại sao các công cụ tồn tại cho C++ nhưng có thể không dành cho C# là tài nguyên trong C# về cơ bản khác nhau vì tài nguyên không được quản lý * không còn kết hợp với đối tượng *. Những gì có thể được truy tìm, cả trong C# và trong C++, là đối tượng suốt đời và cho dù một đối tượng đã được xử lý đúng cách. Nhưng các nguồn tài nguyên dùng một lần trong C# không có bất kỳ cách nào ràng buộc với đối tượng suốt đời, khiến cho việc theo dõi chúng trở nên khó khăn hơn nhiều. Để so sánh, hãy thử theo dõi các tài nguyên GDI bị rò rỉ không bị ràng buộc qua RAII để đối tượng tồn tại trong C++. Không dễ dàng như vậy. –
Tôi đã cân nhắc điều này một chút. Tôi đã phát triển một thói quen kiểm tra nhanh các kiểu khi tôi viết mã để xem chúng có kế thừa từ 'IDisposable' hay không. Nếu họ làm tôi quấn chúng trong 'sử dụng' ở phạm vi họ cần phải sống. Nó không có gì cho mã hiện tại nhưng tôi chỉ nghĩ rằng tôi muốn đề cập đến nó. –
Hãy xem bài đăng này, nơi bạn có thể sử dụng phân tích mã Visual Studio để phát hiện các vấn đề iDisposable tại thời gian biên dịch: http://stackoverflow.com/a/6213977/2862 –