2009-06-23 42 views
16

tôi đã tự hỏi nếu có một số loại cheat sheet mà đối tượng đi cũng với báo cáo kết quả sử dụng ... SQLConnection, MemoryStream vvCó danh sách đối tượng chung nào triển khai IDisposable cho câu lệnh sử dụng không?

Lấy nó thêm một bước nữa, nó sẽ là tuyệt vời để thậm chí hiển thị khác "các mảnh ghép hình", giống như cách bạn thực sự gọi connection.Close() trước khung kết thúc sử dụng câu lệnh.

Mọi thứ như vậy tồn tại? Nếu không, có lẽ chúng ta nên làm một cái.

+0

Tại sao bạn cần gọi kết nối.Đóng() trước khung kết thúc? Tôi không biết rằng có nhiều phần khác trong câu đố. –

+0

Tại sao lại có danh sách? Bạn có thể dễ dàng kiểm tra xem một đối tượng có triển khai IDisposable hay không. – Groo

+0

@Groo: Bạn thực sự phải kiểm tra tài liệu, một số loại ẩn Dispose(). Vì vậy, không phải là dễ dàng. –

Trả lời

10

Microsoft FxCop có quy tắc kiểm tra xem bạn có sử dụng IDisposbale trong khối sử dụng hay không.

1

Với ReSharper, bạn có thể hiển thị tất cả các loại có nguồn gốc. Có lẽ bạn có thể làm điều đó với trình duyệt đối tượng mà không cần ReSharper. Đi đến định nghĩa giao diện và tìm "hiển thị thừa kế".

+0

Bạn cũng không biết ReSharper, thực hiện điều đó làm việc cho giao diện? Và đó là toàn bộ Dự án hoặc bạn có thể bao gồm GAC và các thư mục khác không? –

+0

Nó hoạt động cho tất cả mọi thứ, và có thể bao gồm các hội đồng thư viện, bao gồm cả những người trong GAC. Bạn cũng có thể bấm vào một nhiệm vụ, và nó sẽ gợi ý một khối sử dụng nếu kiểu được gán thực hiện IDisposable. –

4

Nếu bạn không chắc chắn liệu một lớp học có thực hiện IDisposable hay không, hãy đính kèm nó trong khối using bất kể. Nếu bạn nhận được một lỗi biên dịch, chỉ cần loại bỏ nó. Bạn sẽ chỉ mất một vài giây gõ thời gian.

+0

Đúng, điều này hoạt động như một sự quyến rũ. –

+1

Trong hầu hết các trường hợp, nếu có phương thức Vứt bỏ, nó sẽ triển khai IDisposable. – weiqure

+0

@weiqure - nhưng không ngược lại –

2

Cách đơn giản để nhận danh sách các loại triển khai IDisposable là mở Reflector mở, điều hướng đến System.IDisposable, mở rộng nút và sau đó mở rộng nút 'Các loại có nguồn gốc'.

Để chắc chắn rằng danh sách của bạn đã hoàn tất, hãy xác minh rằng tất cả các hội đồng bạn đang sử dụng đã được 'Mở trong Trình phản chiếu.

7

Phương pháp C# sau sẽ liệt kê tất cả các loại IDisposable tìm thấy trong một hội đồng nhất định. (Namespace sử dụng: Hệ thống, System.Collections.Generic, System.IO, System.Reflection)

static void PrintDisposableTypesFromFile(String path) 
    { 
    Assembly assembly = Assembly.LoadFrom(path); 
    foreach (Type type in assembly.GetTypes()) 
     if (type.GetInterface("IDisposable") != null) 
      Console.WriteLine(type.FullName); 
    } 

C# phương pháp sau đây làm cho việc sử dụng trước đó để làm tương tự cho tất cả các cụm trong một thư mục và thư mục con của nó , ví dụ "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727":

static void PrintDisposableTypesFromDirectory(DirectoryInfo dir, bool warn) 
    { 
    foreach (FileInfo file in dir.GetFiles("*.dll")) 
    { 
     try 
     { 
      PrintDisposableTypesFromFile(file.FullName); 
     } 
     catch (Exception ex) 
     { 
      if (warn) 
      { 
       Console.Error.WriteLine(
       String.Format(
        "WARNING: Skipped {0}: {1}", 
        new object[] { file.FullName, ex.Message })); 
      } 
     } 
    } 
    // recurse 
    foreach (DirectoryInfo subdir in dir.GetDirectories()) 
     PrintDisposableTypesFromDirectory(subdir, warn); 

    } 

Tôi không chắc chắn trong danh sách của tất cả các lần hiện là rất hữu ích, nhưng tôi đã sử dụng mã tương tự để tìm những thứ thú vị khác như danh sách đầy đủ các mã hóa văn bản được hỗ trợ bởi .NET framework.

+0

+1 cho nỗ lực, nhưng tôi nghĩ rằng nó sẽ dễ dàng hơn để chỉ sử dụng phản xạ :) –

0

Một cách nhanh chóng kiểm tra xem một loại thực hiện IDisposable là tạo một thể hiện của nó và kiểm tra xem thể hiện có một hàm thành viên Dispose() hay không. Nếu có thì bạn có thể chắc chắn rằng nó thực hiện IDisposable 99%.

3

Ngoài các câu trả lời khác, lưu ý rằng một lớp học có thể triển khai IDisposable nhưng không có Dispose xuất hiện trong danh sách intellisense.

class MyClass :IDisposable 
{ 
    void IDisposable.Dispose() 
    { 
     /* Stuff */ 
    } 
} 
2

Nếu bạn đang sử dụng Visual Studio bạn có thể nhấn F12 trên khai báo kiểu nó sẽ đưa bạn đến một màn hình siêu dữ liệu hoặc định nghĩa lớp (nếu bạn có mã nguồn). Nếu bạn keybindings là khác nhau nhấp chuột phải và "đi đến định nghĩa". Từ đó bạn có thể thấy những gì một lớp thực hiện. Tôi đề nghị làm điều này cho tất cả các lớp học lần đầu tiên bạn gặp họ để có được một "cảm giác" cho những gì lớp học có thể làm.

+2

Có nhưng không phải mọi lớp thực hiện IDisposable thực hiện nó trực tiếp. Lấy DataTable ví dụ (trong đó, BTW, bạn không cần phải vứt bỏ ... nhưng đó là một cuộc hội thoại khác http://stackoverflow.com/questions/913228/should-i-dispose-dataset-and-datatable.) – Grinn

14

Có thể lướt qua bài đăng của tôi về điều này tại http://www.lancemay.com/2010/01/idisposable-cheat-sheet/. Không chắc đó có phải là điều bạn đang tìm kiếm hay không, nhưng dựa trên câu hỏi ban đầu, có vẻ như nó có thể như vậy.

+2

Cool ! Đây chính xác là những gì tôi đang tìm kiếm! –

+0

wow rất nhiều bình luận, trong khi đây là câu trả lời! cảm ơn Lance! – aron

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