2010-06-07 27 views
18

Tôi đang làm việc trên một dự án lớn và một trong những nhiệm vụ của tôi là xóa các rò rỉ bộ nhớ có thể xảy ra. Trong mã của tôi, tôi đã nhận thấy một số mặt hàng IDisposable không được xử lý, và đã cố định đó. Tuy nhiên, điều đó dẫn tôi đến một câu hỏi cơ bản hơn, làm thế nào để tôi tìm thấy tất cả các lớp học sử dụng trong dự án của tôi thực hiện IDisposable? (Không phải các lớp được tạo tùy chỉnh nhưng các lớp Thư viện chuẩn đã được sử dụng).
Tôi đã tìm thấy một lớp ít rõ ràng hơn, triển khai IDisposable (DataTable triển khai MarshalByValueComponent, kế thừa IDisposable). Ngay bây giờ, tôi tự kiểm tra bất kỳ lớp nghi ngờ bằng cách sử dụng MSDN, nhưng không phải là có một số cách mà qua đó tôi có thể tự động hóa quá trình này?Làm cách nào để tìm tất cả các Lớp triển khai IDisposable?

+1

FxCop có thể nói rằng? – Arseny

Trả lời

17

Reflector có thể cho bạn thấy những lớp học thực hiện IDisposable: chỉ cần xác định vị trí giao diện IDisposable trong Reflector, và mở rộng "các loại nguồn gốc" nút

Một lựa chọn khác, từ mã, là để quét tất cả các assembly được nạp với nhiều loại thực hiện IDisposable:

var disposableTypes = 
    from a in AppDomain.CurrentDomain.GetAssemblies() 
    from t in a.GetTypes() 
    where typeof(IDisposable).IsAssignableFrom(t) 
    select t; 
+0

Đoạn mã trên đây, quét tất cả các cụm được nạp (thay vì chỉ là cụm thực thi) và cung cấp tất cả các loại dùng một lần được sắp xếp theo không gian tên, vì vậy rất dễ dàng kiểm tra bất kỳ loại dùng một lần nào mà bạn đã bỏ lỡ. Tx rất nhiều :) – apoorv020

0

Tôi nghĩ điều gì đó giống như mã bên dưới có thể hoạt động. Nó sẽ phải được điều chỉnh để tải lắp ráp chính xác nếu chạy từ một công cụ bên ngoài mặc dù.

Assembly asm = Assembly.GetExecutingAssembly(); 
foreach (Type type in asm.GetTypes()) 
{ 
if(type.GetInterface(typeof(IDisposable).FullName) != null) 
{ 
    // Store the list somewhere 
} 
} 
+0

Đây không phải là chính xác những gì tôi đang tìm kiếm. Mã này lặp lại trên các loại được xác định trong hội đồng hiện tại, trong khi tôi muốn chạy nó trên các loại là được sử dụng trong hội đồng hiện tại.
Tôi có thể dễ dàng kiểm tra nếu một trong các lớp được định nghĩa trong dự án của tôi thực hiện IDisposable, tuy nhiên tôi muốn kiểm tra xem các lớp thư viện chuẩn mà tôi đang sử dụng thực hiện IDisposable hay không. – apoorv020

+0

@ apoorv020: Nên có thể chạy mã trên trên các hội đồng khung .Net (bất kỳ được tham chiếu bởi dự án của bạn) cũng như tôi nghĩ, và sau đó bạn có thể lưu danh sách mọi thứ triển khai 'IDisposable' và sau đó chỉ cần thực hiện tìm kiếm thông qua mã nguồn của bạn cho bất kỳ thứ gì trong danh sách đó? –

+0

Mã của "Thomas Levesque" thực hiện chính xác điều đó. Cảm ơn câu trả lời của bạn mặc dù, nó chỉ cho tôi đi đúng hướng. – apoorv020

0

thử truy vấn LINQ này:

var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes() 
         where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass 
         select t; 
+2

Đừng nghĩ rằng sẽ làm việc, bình luận từ MSDN: * Các phương pháp IsSubclassOf không thể được sử dụng để xác định xem một giao diện xuất phát từ giao diện khác, hoặc cho dù một lớp thực hiện một giao diện * –

+0

cảm ơn cho sửa chữa. –

7

thử nghiệm dự án của bạn với FxCop. Nó có thể bắt tất cả các nơi mà đối tượng IDisposable không được xử lý. Bạn có thể cần phải làm một số công việc để vô hiệu hóa tất cả các quy tắc FxCop không liên quan, chỉ để lại các quy tắc liên quan đến IDisposable.

Ví dụ, đây là một trong những quy tắc FxCop IDisposable: http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx

Lưu ý: bạn cần phải tìm cả của riêng bạn, NET và các đối tượng IDisposable của bên thứ ba mà không được xử lý một cách chính xác.

3

Bạn có thể sử dụng NDepend để phân tích dự án của mình và tìm tất cả các loại triển khai IDisposable.

Here's các truy vấn CQL cho kết quả

SELECT TYPES WHERE Implement "System.IDisposable" 
Các vấn đề liên quan