Điều khoản tài nguyên được quản lý và tài nguyên không được quản lý trong .NET có nghĩa là gì? Làm thế nào để họ đi vào hình ảnh?
Điều khoản tài nguyên được quản lý và tài nguyên không được quản lý trong .NET có nghĩa là gì? Làm thế nào để họ đi vào hình ảnh?
Câu trả lời:
Thuật ngữ "tài nguyên không được quản lý" thường được sử dụng để mô tả thứ gì đó không trực tiếp dưới sự kiểm soát của bộ thu gom rác . Ví dụ: nếu bạn mở kết nối với máy chủ cơ sở dữ liệu, điều này sẽ sử dụng tài nguyên trên máy chủ (để duy trì kết nối) và có thể là các tài nguyên khác ngoài.net trên máy khách, nếu trình cung cấp không được viết hoàn toàn bằng mã được quản lý.
Đây là lý do tại sao, đối với một cái gì đó như kết nối cơ sở dữ liệu, bạn nên viết mã của mình như vậy:
using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}
Vì điều này đảm bảo rằng nó .Dispose()
được gọi trên đối tượng kết nối, đảm bảo rằng mọi tài nguyên không được quản lý đều được dọn sạch.
Trong phần Hỏi & Đáp Tài nguyên không được quản lý là gì? 1 , Bruce Wood đã đăng những điều sau:
Tôi nghĩ về các thuật ngữ "được quản lý" và "không được quản lý" theo cách này:
"Được quản lý" đề cập đến mọi thứ trong hộp cát .NET. Điều này bao gồm tất cả các lớp .NET Framework.
"Không được quản lý" đề cập đến vùng hoang dã bên ngoài hộp cát .NET. Điều này bao gồm bất kỳ thứ gì được trả lại cho bạn thông qua các lệnh gọi đến các hàm API Win32.
Nếu bạn không bao giờ gọi một hàm Win32 API và không bao giờ lấy lại bất kỳ đối tượng "xử lý" Win32 nào, thì bạn đang không nắm giữ bất kỳ tài nguyên không được quản lý nào. Các tệp và luồng mà bạn mở qua các phương thức lớp .NET Framework đều là trình bao bọc được quản lý.
Nhận xét: Bạn có thể không trực tiếp nắm giữ tài nguyên không được quản lý . Tuy nhiên, bạn có thể đang nắm giữ một tài nguyên không được quản lý gián tiếp thông qua một "lớp trình bao bọc" được quản lý như System.IO.FileStream . Một lớp trình bao bọc như vậy thường triển khai IDisposable (trực tiếp hoặc thông qua kế thừa).
... nhiều đối tượng được quản lý (.NET Framework) đang giữ các tài nguyên không được quản lý bên trong chúng và bạn có thể muốn Loại bỏ () chúng ngay khi có thể, hoặc ít nhất là cho người gọi của bạn cơ hội làm như vậy. Đó là nơi viết phương thức Dispose () của riêng bạn. Về cơ bản, việc triển khai IDisposable () thực hiện hai việc cho bạn:
Cho phép bạn loại bỏ bất kỳ tài nguyên nào bạn lấy trực tiếp từ hệ điều hành phía sau .NET (tài nguyên không được quản lý).
Cho phép bạn và người gọi của bạn giải phóng các đối tượng .NET khổng lồ / các đối tượng .NET đang nắm giữ các tài nguyên quý giá trong bàn tay nhỏ bé mà bạn / người gọi của bạn muốn phát hành ngay bây giờ .
Nhận xét: Bằng cách triển khai IDisposable
và do đó cung cấp một Dispose()
phương pháp, bạn đang cho phép người dùng trong lớp của bạn phát hành một cách xác định bất kỳ tài nguyên không được quản lý nào được giữ bởi một phiên bản lớp của bạn.
1 Liên kết ban đầu được chia sẻ trong câu trả lời của Sachin Shanbhag . Tài liệu được trích dẫn ngày 2005-11-17. Lưu ý rằng tôi đã sao chép và chỉnh sửa nhẹ nội dung được trích dẫn.
Sự khác biệt cơ bản giữa tài nguyên được quản lý và không được quản lý là bộ thu gom rác biết về tất cả các tài nguyên được quản lý, tại một thời điểm nào đó GC sẽ xuất hiện và dọn dẹp tất cả bộ nhớ và tài nguyên liên quan đến đối tượng được quản lý. GC không biết về các tài nguyên không được quản lý, chẳng hạn như tệp, luồng và xử lý, vì vậy nếu bạn không dọn dẹp chúng một cách rõ ràng trong mã của mình thì bạn sẽ bị rò rỉ bộ nhớ và tài nguyên bị khóa.
Để biết thêm chi tiết - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources