Để thêm một chút để câu trả lời của Brian, và nhận xét của bạn/câu hỏi:
Sự khác biệt giữa một nguồn tài nguyên được quản lý/Switch là Collector rác là nhận thức của các nguồn tài nguyên được quản lý và không nhận thức được các nguồn lực không được quản lý. Tôi biết rằng câu trả lời không phải là rất cụ thể nhưng sự khác biệt là rất lớn.
Để giúp vẽ đường trên cát ở đây là phiên bản ngắn (và có lẽ thủng với lỗi nhỏ) của GC chạy như thế nào và dọn dẹp bộ nhớ:
thu
Rác là nhận thức của tất cả các đối tượng được quản lý nhưng khi rác bộ sưu tập chạy nó ban đầu không biết nếu bất kỳ đối tượng nhất định vẫn được sử dụng hoặc là sang trọng để được phát hành. Nó xác định có hay không nó có thể dọn dẹp một đối tượng bằng cách đánh dấu tất cả các đối tượng là rác, sau đó đi ngang từ gốc ứng dụng đến tất cả các đối tượng được tham chiếu. Mỗi đối tượng có mối quan hệ trở lại gốc (tham chiếu, trực tiếp hoặc gián tiếp) được đánh dấu là có thể truy cập và không còn được coi là rác. Sau khi GC chạy qua mọi đối tượng có thể truy cập, nó sẽ dọn sạch phần còn lại vì chúng không còn được sử dụng nữa.
Trong hầu hết các trường hợp làm việc với các đối tượng .NET framework, bạn có thể yên tâm rằng các đối tượng được quản lý (.NET cung cấp các trình bao bọc được quản lý gần như tất cả các tài nguyên không được quản lý để đảm bảo chúng được dọn dẹp đúng cách); các thành phần bên thứ ba khác móc vào API Win32 (hoặc các thành phần của bạn làm điều này) là các đối tượng có thể gây ra mối quan tâm.
Có một số đối tượng .NET có thể được coi là không được quản lý. Các thành phần của thư viện đồ họa là một ví dụ.
Hầu hết "rò rỉ bộ nhớ .NET" không thực sự bị rò rỉ bộ nhớ theo đúng nghĩa. Thông thường, chúng xuất hiện khi bạn nghĩ rằng bạn đã xóa một đối tượng khỏi sử dụng nhưng trên thực tế đối tượng vẫn có một số tham chiếu đến ứng dụng. Một ví dụ phổ biến là thêm eventhandlers (obj.SomeEvent + = OnSomeEvent -or- AddHandler obj.SomeEvent, AddressOf OnSomeEvent) và không loại bỏ chúng.
Những 'tham chiếu kéo dài' này về mặt kỹ thuật không rò rỉ bộ nhớ vì ứng dụng của bạn vẫn đang sử dụng kỹ thuật chúng; tuy nhiên nếu có đủ ứng dụng của bạn có thể bị ảnh hưởng nghiêm trọng về hiệu suất và có thể hiển thị các dấu hiệu của các vấn đề tài nguyên (OutOfMemoryExceptions, không thể đạt được xử lý cửa sổ, v.v.).
Tôi là một nhà phát triển .NET trung gian và không may biết về những vấn đề này trực tiếp. Tôi khuyên bạn nên chơi với ANTS Profiler để giúp làm quen với các tài liệu tham khảo kéo dài (có một phiên bản dùng thử miễn phí) hoặc nếu bạn muốn nghiên cứu nhiều hơn một chút bằng cách sử dụng WinDbg và SOS.DLL để xem xét vùng quản lý. Nếu bạn quyết định xem xét sau này, tôi khuyên bạn nên đọc blog của Tess Ferrandez; cô ấy có rất nhiều hướng dẫn tuyệt vời và lời khuyên về việc sử dụng Windbg hiệu quả
Vì vậy, là một loại quản lý mà không thực hiện IDisposable một nguồn lực không được quản lý? Có lẽ tôi đang bị nhầm lẫn bởi các loại câu thơ tài nguyên ... –
@Yooder: Làm thế nào bạn có thể có một tài nguyên được quản lý mà không được đại diện bởi một loại? –
@LarryFix: Những người khác nhau sử dụng thuật ngữ khác nhau, nhưng tôi sẽ nói rằng một đối tượng không hỏi * cái gì khác * để làm điều gì đó thay mặt nó, cho đến khi có thông báo mới, và gây tổn hại cho người khác, không giữ * bất kỳ * tài nguyên. – supercat