Co oznaczają terminy zasób zarządzany i zasób niezarządzany w .NET? Jak wchodzą do obrazu?
Co oznaczają terminy zasób zarządzany i zasób niezarządzany w .NET? Jak wchodzą do obrazu?
Odpowiedzi:
Termin „niezarządzany zasób” jest zwykle używany do opisania czegoś, co nie jest bezpośrednio kontrolowane przez moduł odśmiecania pamięci . Na przykład, jeśli otworzysz połączenie z serwerem bazy danych, spowoduje to użycie zasobów na serwerze (do utrzymania połączenia) i prawdopodobnie innych zasobów spoza sieci na komputerze klienckim, jeśli dostawca nie jest napisany w całości w kodzie zarządzanym.
Dlatego dla czegoś takiego jak połączenie z bazą danych, zaleca się napisanie kodu w ten sposób:
using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}
Ponieważ zapewnia to, że .Dispose()
jest on wywoływany w obiekcie połączenia, upewniając się, że wszystkie niezarządzane zasoby są czyszczone.
W pytaniach i odpowiedziach Czym są niezarządzane zasoby? 1 , Bruce Wood napisał co następuje:
Myślę o terminach „zarządzany” i „niezarządzany” w ten sposób:
„Zarządzane” oznacza wszystko w piaskownicy .NET. Dotyczy to wszystkich klas .NET Framework.
„Niezarządzany” odnosi się do obszarów dzikich poza piaskownicą .NET. Obejmuje to wszystko, co jest zwracane przez wywołania funkcji Win32 API.
Jeśli nigdy nie wywołasz funkcji API Win32 i nie odzyskasz żadnych obiektów „obsługi” Win32, oznacza to, że nie masz żadnych niezarządzanych zasobów. Pliki i strumienie otwierane za pomocą metod klasy .NET Framework są zarządzanymi opakowaniami.
Komentarz: Być może nie posiadających zasób niezarządzanej bezpośrednio . Jednak możesz pośrednio przechowywać niezarządzany zasób za pośrednictwem zarządzanej „klasy opakowania”, takiej jak System.IO.FileStream . Taka klasa opakowania zwykle implementuje IDisposable (bezpośrednio lub przez dziedziczenie).
... wiele zarządzanych obiektów (.NET Framework) zawiera w sobie niezarządzane zasoby i prawdopodobnie zechcesz je jak najszybciej pozbyć się () lub przynajmniej zaoferować dzwoniącym możliwość zrobienia tego. W tym miejscu pojawia się napisanie własnej metody Dispose (). Zasadniczo implementacja IDisposable () robi za Ciebie dwie rzeczy:
Pozwala pozbyć się wszelkich zasobów, które zostały pobrane bezpośrednio z systemu operacyjnego za plecami platformy .NET (zasoby niezarządzane).
Pozwala tobie i twoim dzwoniącym uwolnić potężne obiekty .NET / obiekty .NET, które trzymają cenne zasoby w swoich brudnych małych rączkach, które ty / twoi dzwoniący chcecie teraz uwolnić .
Komentarz: Implementując, IDisposable
a tym samym udostępniając Dispose()
metodę, umożliwiasz użytkownikowi Twojej klasy zwalnianie w sposób deterministyczny wszelkich niezarządzanych zasobów, które są przechowywane przez instancję Twojej klasy.
1 Link pierwotnie udostępniony w odpowiedzi Sachin Shanbhag . Cytowany materiał z dnia 2005-11-17. Zwróć uwagę, że przytoczoną przeze mnie treść lekko skopiowałem.
Podstawowa różnica między zasobem zarządzanym i niezarządzanym polega na tym, że moduł wyrzucania elementów bezużytecznych wie o wszystkich zarządzanych zasobach, w pewnym momencie pojawi się GC i wyczyści całą pamięć i zasoby skojarzone z zarządzanym obiektem. GC nie wie o niezarządzanych zasobach, takich jak pliki, strumienie i uchwyty, więc jeśli nie wyczyścisz ich jawnie w swoim kodzie, skończy się to na wyciekach pamięci i zablokowanych zasobach.
Aby uzyskać więcej informacji - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources
Zarządzane zasoby to zasoby, które mogą zostać zwolnione przez moduł odśmiecania pamięci, a niezarządzane zasoby nie mogą zostać zwolnione przez moduł odśmiecania pamięci.